2016-08-08 1 views
1

Bon, je me rends. Je ne peux pas le comprendre.LoaderManager n'accepte pas 'ceci'

Je suis un cours Udacity sur Android Basics et j'ai besoin de comprendre comment charger des données en utilisant un chargeur. Cependant, lorsque j'utilise la ligne suivante, « ceci » est mis en évidence en rouge et en montrant l'erreur suivante:

Wrong 3rd argument type. Found 'com.example.carl.latestnews.MainActivity', required: 'android.app.LoaderManager.LoaderCallbacks<java.lang.Object> 

J'ai googlé, et empilée suggestion essayé, je l'ai trouvé. J'ai essayé de créer une classe interne qui implémente les rappels. J'ai frappé un brickwall et je suis assis ici me grattant la tête en essayant de comprendre ce qui me manque! Est-ce que quelqu'un peut me dire ce que je fais mal ici?

Merci d'avance!

package com.example.carl.latestnews; 


import android.content.Context; 
import android.os.Bundle; 
import android.support.v4.app.LoaderManager; 
import android.support.v4.content.AsyncTaskLoader; 
import android.support.v4.content.Loader; 
import android.support.v7.app.AppCompatActivity; 
import android.view.View; 
import android.widget.ListView; 
import android.widget.TextView; 
import java.util.ArrayList; 

public class MainActivity extends AppCompatActivity implements LoaderManager.LoaderCallbacks<ArrayList<ArticleObject>> { 

    // ArticleObject is a custom object which contains a headline, date, category etc of a news article 

    // URL for Guardian API including API Key 
    final static String GUARDIAN_API_URL = "https://content.guardianapis.com/search?"; 

    // API Key 
    final static String GUARDIAN_API_KEY = "test"; 

    // ID for LoaderManager 
    final static int LOADER_MANAGER_ID = 0; 


    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     // Get or initialize loader manager 
     getLoaderManager().initLoader(LOADER_MANAGER_ID, null, this); 

    } 

    @Override 
    public Loader<ArrayList<ArticleObject>> onCreateLoader(int id, Bundle args) { 
     return new dataLoader(); // dataLoader() removed for easy reading 
    } 

    @Override 
    public void onLoadFinished(Loader<ArrayList<ArticleObject>> loader, ArrayList<ArticleObject> data) { 
     /UI Update Code 
    } 

    @Override 
    public void onLoaderReset(Loader<ArrayList<ArticleObject>> loader) { 
     // Reset Code 
    } 




} 
+0

S'il vous plaît modifier votre question et de fournir votre 'dataLoader' définition de classe. – CommonsWare

Répondre

1

Cette méthode attend LoaderCallbacks en tant qu'argument. Votre activité doit implémenter le code LoaderCallbacks interface. OU vous fournir une implémentation anonyme de cette interface comme:

LoaderManager.LoaderCallbacks callbacks = new LoaderManager.LoaderCallbacks() { 
     @Override 
     public Loader onCreateLoader(int id, Bundle args) { 
      return null; 
     } 

     @Override 
     public void onLoadFinished(Loader loader, Object data) { 

     } 

     @Override 
     public void onLoaderReset(Loader loader) { 

     } 

    getLoaderManager().initLoader(LOADER_MANAGER_ID, null, callback); 

La mise en œuvre des méthodes d'interface est à vous cependant, ce code ne fonctionne pas tout de suite.

+0

Salut Ascorbin. J'ai essayé le ci-dessus mais l'argument de rappel dans la dernière ligne est accentué et montrant la même erreur ??? – Caphson

+0

@Caphson Vous devez être plus précis sur ce qu'est l'erreur. Notez qu'il existe différentes versions de la plupart des éléments du chargeur (normal et v4), vérifiez vos importations s'il y a quelque chose de mélangé. – FWeigl

5

Change:getLoaderManager() à getSupportLoaderManager();
Comme ceci:
getLoaderManager().initLoader(ID_FAVORITE_METAINFO_LOADER, args, this);
Pour
getSupportLoaderManager().initLoader(ID_FAVORITE_METAINFO_LOADER, args, this);

+0

Merci, je fais le même cours que l'OP. Changer 'getLoaderManager' en' getSupportLoaderManager' a résolu mon problème. – jungledev