Nie jest dla mnie jasne, jak uzyskać właściwy kursor, jeśli masz wiele programów ładujących. Powiedzmy, że definiujesz dwa różne programy ładujące za pomocą:
getLoaderManager().initLoader(0,null,this);
getLoaderManager().initLoader(1,null,this);
następnie w onCreateLoader () robisz różne rzeczy w zależności od id:
@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;
}
na razie w porządku. Ale jak uzyskać właściwy kursor w onLoadFinished (), ponieważ nie dostajesz żadnego identyfikatora do zidentyfikowania właściwego kursora dla odpowiedniego adaptera Cursor.
@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
czy też się mylę i jest to niewłaściwy sposób uzyskania wyników dla dwóch różnych adapterów kursora w jednym fragmencie.
android
android-loadermanager
android-loader
Kay Gladen
źródło
źródło
LoaderCallbacks
w tym przypadku) z więcej niż jednego rodzaj. Po prostu działa w twoim przypadku, ponieważ za każdym razem wynikiem jestCursor
.Loader
s. Przejdź przez ten stackoverflow.com/a/20839825/2818583Odpowiedzi:
Klasa Loader ma metodę o nazwie getId () . Mam nadzieję, że zwróci to identyfikator powiązany z programem ładującym.
źródło
getId()
?Użyj metody getId () modułu ładującego :
źródło
Jeśli twoje programy ładujące nie mają nic wspólnego poza typem klasy wyniku (tutaj
Cursor
:), lepiej jest utworzyć dwie oddzielneLoaderCallbacks
instancje (po prostu jako dwie klasy wewnętrzne w twoim Activity / Fragment), z których każda jest przeznaczona do jednego traktowania modułu ładującego. niż mieszanie jabłek z pomarańczami.W twoim przypadku wydaje się, że zarówno źródło danych, jak i sposób przetwarzania wyników są różne, co wymaga napisania dodatkowego standardowego kodu, aby zidentyfikować bieżący scenariusz i wysłać go do odpowiedniego bloku kodu.
źródło
Activity
wdrożeniaLoaderCallbacks
i przejściathis
dogetLoaderManager().initLoader()
jest zapewnienie, żeLoaderManager
działa jako kanał komunikacji międzyActivity
iLoader
za pośrednictwemLoaderCallbacks
. Jak powstaje ten kanał komunikacyjny, któryActivity
nie jest implementacją,LoaderCallbacks
ale raczej tworzeniem anonimowych klas wewnętrznych?LoaderCallbacks
. Nic nie wymaga używaniaActivity
samego siebie jakoLoaderCallbacks
. Łatwiej jest stworzyć wiele kanałów komunikacji, kiedy ich potrzebujesz.