Jak mogę odświeżyć mój ListFragment, gdy powróci do układu z tylnego stosu?
Najpierw powinienem wspomnieć, że używam biblioteki ActionBarSherlock dla wstecznej kompatybilności.
Mam działanie, które dodaje aListFragment
kiedy się zaczyna. Mam zwyczajLoader
które wdrożyłem i śledzęPrzykład AsnycTaskLoader bardzo blisko. MójListFragment
implementujeLoaderCallbacks<Cursor>
berło. Wszystkie odpowiednie metody wywołania zwrotnego są wywoływane po dodaniu fragmentu (onCreateLoader()
, onLoaderFinished()
) i kiedy zostanie zastąpiony (onLoaderReset()
).
MójonActivityCreated(Bundle)
metoda wygląda tak:
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
mAccountsDbAdapter = new AccountsDbAdapter(getActivity().getApplicationContext());
setHasOptionsMenu(true);
mCursorAdapter = new AccountsCursorAdapter(getActivity()
.getApplicationContext(), R.layout.list_item_account, null,
new String[] { DatabaseHelper.KEY_NAME },
new int[] { R.id.account_name }, 0);
setListAdapter(mCursorAdapter);
getLoaderManager().initLoader(0, null, this);
}
PóźniejListFragment
jest zastępowany innym fragmentem B. Gdy użytkownik naciśnie przycisk Wstecz, fragment B jest usuwany i ponownie dodawany jest fragment listy. Lista jest jednak pusta i tylkoandroid:empty
elementy są wyświetlane i nie są wywoływane żadne metody LoaderCallback. Mogę użyć debugera, aby to ustalićgetLoaderManager().initLoader(0, null, this);
jest rzeczywiście nazywany, ale nic więcej. Kiedy go zmienięgetLoaderManager().restartLoader(0, null, this);
, wywołania zwrotne są wywoływane, ale nadal moja lista pozostaje pusta (chociaż istnieją dane, widok nie jest odświeżany).
Jak uzyskać odświeżenie mojego ListFragmentu po powrocie do układu? Czy ktoś napotkał to wcześniej, jak to naprawiłeś?
FYI, oto moje metody oddzwaniania
@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
return new AccountsCursorLoader(this.getActivity()
.getApplicationContext());
}
@Override
public void onLoadFinished(Loader<Cursor> loaderCursor, Cursor cursor) {
mCursorAdapter.swapCursor(cursor);
mCursorAdapter.notifyDataSetChanged();
}
@Override
public void onLoaderReset(Loader<Cursor> arg0) {
mCursorAdapter.swapCursor(null);
}
Niektóre notatki:
Nie mogę użyćsetListShown(true)
metody w tym przykładzie, ponieważ otrzymujęIllegalStateException
że nie można go używać z niestandardowym widokiem zawartości.MójAccountsCursorAdapter
rozszerza aSimpleCursorAdapter
i modyfikuje tylkobindView()
metoda.