首先我应该提到我正在使用 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替换为另一个 Fragment B。当用户按下后退按钮时,Fragment B 被删除并再次添加 ListFragment。但是,列表是空的,只android:empty显示元素,并且没有调用任何 LoaderCallback 方法。我可以使用调试器来确定getLoaderManager().initLoader(0, null, this);实际调用的,但没有别的。当我将其更改为 时getLoaderManager().restartLoader(0, null, this);,会调用回调,但我的列表仍然为空(尽管有数据,但视图未刷新)。
当我的 ListFragment 返回到布局时,如何让我的 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);
}
一些注意事项:
- 我不能使用
setListShown(true)示例中的方法,因为我知道IllegalStateException它不能与自定义内容视图一起使用。 - 我
AccountsCursorAdapter扩展了 aSimpleCursorAdapter并且只修改了bindView()方法。