2012-10-24 3 views
5

Hoffentlich einfache Java-Frage, die ich gerade vergessen oder nie verstanden habe. Ich habe in Android 4.0 mit Loadern gespielt. Das Programm funktioniert so wie es war, aber jetzt schaue ich auf den "nächsten" Teil. Ich möchte einen Standard-Cursor-Loader und einen benutzerdefinierten AsyncTaskLoader. Ich bin auf Teil 1 stecken und versuche einen cursorLoader zu einem Loader zu konvertieren und es zurückzugeben.Wie cursorLoader zu Loader zu werfen <Object>

@Override 
    //public Loader<Cursor> onCreateLoader(int id, Bundle args) { 
    public Loader<Object> onCreateLoader(int id, Bundle args) { 

     if (id == LISTVIEWLOADER) { 
      String[] projection = { RunnerTable.COLUMN_ID, 
        RunnerTable.COLUMN_NAME }; 
      CursorLoader cursorLoader = new CursorLoader(getActivity(), 
        FanContentProvider.CONTENT_URI, projection, null, null, 
        null); 


      return cursorLoader; //HERE IS THE PROBLEM 
     } 
     return null; 
    } 

Typenkonflikt kann nicht von CursorLoader in Loader konvertiert werden.

Ich glaube, es kann mit

public class MainFragment extends ListFragment implements 
     //LoaderManager.LoaderCallbacks<Cursor> 
     LoaderManager.LoaderCallbacks 

Aber nicht wie die Warnung funktioniert:

LoaderManager.LoaderCallbacks ist eine rohe Art. Verweise auf den generischen Typ LoaderManager.LoaderCallbacks sollten parametrisiert werden

Vielen Dank für Ihre Unterstützung.

Antwort

2

ändern

public Loader<Object> onCreateLoader(int id, Bundle args) { 

zu

public Loader<? extends Object> onCreateLoader(int id, Bundle args) { 

erste Anweisung sagt Jvm, Rückgabetyp Object Beton ist. Eine neue Anweisung sagt jvm, dass jeder TYPE von Object ist.

Bitte lesen Sie diese tutorial.

+2

Angst, dass immer noch nicht funktioniert. Der Rückgabetyp ist nicht kompatibel mit LoaderManager.LoaderCallbacks . OnCreateLoader (Int, Bundle). – jimsis

7

Überprüfen Sie Ihre Import, können Sie mis verwenden diese 2:

import android.content.CursorLoader; 

und

import android.support.v4.content.CursorLoader; 
+1

Willkommen bei Stackoverflow! Ihre Antwort wäre viel hilfreicher, wenn Sie hervorheben würden, wie genau diese Importe missbraucht werden. – mvp

-1

einen Blick auf diese: Android AsyncTaskLoader Reference

ich Ihr Problem an dieser Linie befindet glauben :

public class MainFragment extends ListFragment implements 
    //LoaderManager.LoaderCallbacks<Cursor> 
    LoaderManager.LoaderCallbacks 

Sie sollten so zu etwas ändern:

public static class AppListFragment extends ListFragment 
    implements LoaderManager.LoaderCallbacks<List<AppEntry>> 
29

Auch wenn dies ein alter Thread ist, hat es noch nicht vollständig beantwortet. Das Problem hier wurde von tch0106 berührt, aber nicht vollständig beschrieben.

Ich habe gerade das gleiche Problem und löste es im Import-Bereich. Einfach ausgedrückt: Verwenden Sie den Support Loader, CursorLoader und LoaderCallbacks zusammen.

Mehrere Klassen können sowohl in den lokalen Bibliotheken von Android als auch in den Support-Bibliotheken gefunden werden. Mischen Sie die Unterstützungsbibliotheken nicht mit den Nicht-Unterstützungsbibliotheksversionen.

// Use these together 
import android.support.v4.content.CursorLoader; 
import android.support.v4.app.LoaderManager.LoaderCallbacks; 
import android.support.v4.content.Loader; 
import android.support.v4.widget.SimpleCursorAdapter; 

// Or use these, but don't mix and match 
import android.content.CursorLoader; 
import android.content.Loader; 
import android.app.LoaderManager.LoaderCallbacks; 
import android.widget.SimpleCursorAdapter; 
+0

Das funktionierte von mir. Ich habe den Import von android.support.v4.content.CursorLoader mit dem Import von android.app.LoaderManager.LoaderCallbacks gemischt. Danke, dass du mir geholfen hast, das schnell zu finden. Jemand sollte dies als die richtige Antwort markieren. –

+0

Hat nicht funktioniert für mich :( – Brandon

+0

arbeitete Mann !! super !! Bitte markieren Sie es als Antwort. – eRaisedToX

0

Ich habe mein Problem gelöst, sehr ähnlich wie diese, durch einen Import zu ändern ... Ich habe den Fehler gemacht, als ich die benutzerdefinierten loader erklärt.

// My custom loader java class: 

import android.content.Context; 
import android.content.AsyncTaskLoader; //this was the place of my mistake right here 
import java.util.ArrayList; 

public class ArticleLoader extends AsyncTaskLoader<ArrayList<Article>> { 

    public ArticleLoader(Context context){ 
     super(context); 
    } 

    @Override 
    protected void onStartLoading() { 
     forceLoad(); 
    } 

    @Override 
    public ArrayList<Article> loadInBackground() { 
     ArrayList<Article> articles = QueryUtils.fetchArticles(getContext()); 
     return articles; 
    } 
} 

Also, was geschah, war, dass ich nicht darauf geachtet genug und Android Studio hat automatisch importierte die ‚android.support.v4.content.AsyncTaskLoader‘.

Hoffe das hilft jemandem!

Ton

Verwandte Themen