First I should mention that I am using the ActionBarSherlock library for backwards compatibility.
I have an activity which adds a ListFragment
when it is first started. I have a custom Loader
which I implemented and follows the AsnycTaskLoader example very closely. My ListFragment
implements the LoaderCallbacks<Cursor>
interface. All the appropriate callback methods are called when the fragment is added (onCreateLoader()
, onLoaderFinished()
) and when it is replaced (onLoaderReset()
).
My onActivityCreated(Bundle)
method looks like this:
@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);
}
Later on, the ListFragment
is replaced with another Fragment B.
When the user presses the back button, Fragment B is removed and the ListFragment is added again. However, the list is empty and only the android:empty
elements are displayed and none of the LoaderCallback methods are called. I can use the debugger to determine that getLoaderManager().initLoader(0, null, this);
is actually called, but nothing else.
When I change it to getLoaderManager().restartLoader(0, null, this);
, the callbacks get called, but still my list remains empty (although there is data, the view is not refreshed).
How can I get my ListFragment to refresh itself when it is returned to the layout? Has anyone encountered this before, how did you fix it?
FYI, here are my callback methods
@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);
}
Some notes:
- I cannot use the
setListShown(true)
methods in the example because I get anIllegalStateException
that it cannot be used with a custom content view. - My
AccountsCursorAdapter
extends aSimpleCursorAdapter
and modifies only thebindView()
method.