Как я могу обновить свой ListFragment, когда он возвращается к макету из заднего стека?
Сначала я должен упомянуть, что я использую библиотеку ActionBarSherlock для обратной совместимости.
У меня есть активность, которая добавляетListFragment
когда это впервые началось. У меня есть обычайLoader
который я реализовал и следуетПример AsnycTaskLoader очень близко. мойListFragment
реализуетLoaderCallbacks<Cursor>
интерфейс. Все соответствующие методы обратного вызова вызываются при добавлении фрагмента (onCreateLoader()
, onLoaderFinished()
) и когда он будет заменен (onLoaderReset()
).
мойonActivityCreated(Bundle)
Метод выглядит так:
@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);
}
ПозжеListFragment
заменяется другим фрагментом B.
Когда пользователь нажимает кнопку «Назад», фрагмент B удаляется, а ListFragment добавляется снова. Тем не менее, список пуст и толькоandroid:empty
элементы отображаются, и ни один из методов LoaderCallback не вызывается. Я могу использовать отладчик, чтобы определить, чтоgetLoaderManager().initLoader(0, null, this);
на самом деле называется, но больше ничего.
Когда я изменяю это наgetLoaderManager().restartLoader(0, null, this);
обратные вызовы вызываются, но мой список остается пустым (хотя данные есть, представление не обновляется).
Как я могу заставить свой ListFragment обновлять себя, когда он возвращается в макет? Кто-нибудь сталкивался с этим раньше, как вы это исправили?
К вашему сведению, вот мои методы обратного вызова
@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);
}
Некоторые заметки:
I cannot use thesetListShown(true)
methods in the example because I get an IllegalStateException
that it cannot be used with a custom content view.
My AccountsCursorAdapter
extends a SimpleCursorAdapter
and modifies only the bindView()
method.