Wie kann ich mein ListFragment aktualisieren, wenn es vom Backstack zum Layout zurückkehrt?
Zunächst sollte ich erwähnen, dass ich die ActionBarSherlock-Bibliothek aus Gründen der Abwärtskompatibilität verwende.
Ich habe eine Aktivität, die a hinzufügtListFragment
wenn es zum ersten Mal gestartet wird. Ich habe eine SitteLoader
das habe ich umgesetzt und befolge dieAsnycTaskLoader Beispiel sehr nah. MeineListFragment
implementiert dieLoaderCallbacks<Cursor>
Schnittstelle. Alle entsprechenden Callback-Methoden werden beim Hinzufügen des Fragments aufgerufen (onCreateLoader()
, onLoaderFinished()
) und wenn es ersetzt wird (onLoaderReset()
).
MeineonActivityCreated(Bundle)
Methode sieht so aus:
@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);
}
Später dieListFragment
wird durch ein anderes Fragment B ersetzt. Wenn der Benutzer die Zurück-Taste drückt, wird Fragment B entfernt und das ListFragment wird erneut hinzugefügt. Die Liste ist jedoch leer und nur dieandroid:empty
Elemente werden angezeigt und keine der LoaderCallback-Methoden aufgerufen. Ich kann den Debugger verwenden, um das festzustellengetLoaderManager().initLoader(0, null, this);
heißt eigentlich aber sonst nix. Wenn ich es änderegetLoaderManager().restartLoader(0, null, this);
werden die Rückrufe aufgerufen, aber meine Liste bleibt leer (obwohl Daten vorhanden sind, wird die Ansicht nicht aktualisiert).
Wie kann ich mein ListFragment dazu bringen, sich zu aktualisieren, wenn es wieder im Layout angezeigt wird? Hat jemand dies schon einmal erlebt, wie haben Sie es behoben?
Zu Ihrer Information, hier sind meine Rückrufmethoden
@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);
}
Einige Notizen:
Ich kann das nicht benutzensetListShown(true)
Methoden im Beispiel, weil ich eineIllegalStateException
dass es nicht mit einer benutzerdefinierten Inhaltsansicht verwendet werden kann.MeineAccountsCursorAdapter
erweitert aSimpleCursorAdapter
und modifiziert nur diebindView()
Methode.