Für mich ist nicht klar, wie man den richtigen Cursor bekommt, wenn man mehrere Lader hat. Nehmen wir an, Sie definieren zwei verschiedene Loader mit:
getLoaderManager().initLoader(0,null,this);
getLoaderManager().initLoader(1,null,this);
dann machen Sie in onCreateLoader () abhängig von der ID verschiedene Dinge:
@Override
public Loader<Cursor> onCreateLoader(int id, Bundle arg1) {
if (id==0){
CursorLoader loader = new CursorLoader(getActivity(),
MaterialContentProvider.CONTENT_URI,null,null,null,null);
}else{
CursorLoader loader = new CursorLoader(getActivity(),
CustomerContentProvider.CONTENT_URI,null,null,null,null);
};
return loader;
}
So weit, ist es gut. Aber wie man den richtigen Cursor in onLoadFinished () erhält, weil man keine ID erhält, um den richtigen Cursor für den richtigen Cursoradapter zu identifizieren.
@Override
public void onLoadFinished(Loader<Cursor> arg0, Cursor cursor) {
mycursoradapter1.swapCursor(cursor);
if(isResumed()){
setListShown(true);
}else {
setListShownNoAnimation(true);
}
}
//and where to get the cursor for mycursoradapter2
oder irre ich mich und dies ist der falsche Weg, um Ergebnisse für zwei verschiedene Cursoradapter in einem Fragment zu erhalten.
android
android-loadermanager
android-loader
Kay Gladen
quelle
quelle
LoaderCallbacks
in diesem Fall) mit mehr als einem Art. Es funktioniert nur in Ihrem Fall, da beide Male das Ergebnis a istCursor
.Loader
s verwenden. Bitte gehen Sie durch diese stackoverflow.com/a/20839825/2818583Antworten:
Die Loader-Klasse verfügt über eine Methode namens getId () . Ich würde hoffen, dass dies die ID zurückgibt, die Sie dem Loader zugeordnet haben.
quelle
getId()
?Verwenden Sie die getId () -Methode von Loader:
quelle
Wenn Ihre Loader nichts gemeinsam haben als den Klassentyp des Ergebnisses (hier :)
Cursor
, sollten Sie besser zwei separateLoaderCallbacks
Instanzen erstellen (einfach als zwei innere Klassen in Ihrer Aktivität / Ihrem Fragment), die jeweils einer Loader-Behandlung gewidmet sind als zu versuchen, Äpfel mit Orangen zu mischen.In Ihrem Fall scheinen sowohl die Datenquelle als auch die Ergebnisbehandlung unterschiedlich zu sein. Daher müssen Sie den zusätzlichen Boilerplate-Code schreiben, um das aktuelle Szenario zu identifizieren und an den entsprechenden Codeblock zu senden.
quelle
Activity
UmsetzungLoaderCallbacks
und Weitergabethis
angetLoaderManager().initLoader()
ist , um sicherzustellen , dassLoaderManager
wirkt als Kommunikationskanal zwischenActivity
undLoader
überLoaderCallbacks
. Wie wird dieser Kommunikationskanal hier erstellt, da erActivity
nicht implementiertLoaderCallbacks
, sondern anonyme innere Klassen erstellt?LoaderCallbacks
. Nichts erfordert, sichActivity
selbst als zu verwendenLoaderCallbacks
. Es ist einfacher, bei Bedarf mehrere Kommunikationskanäle zu erstellen.