首先我应该提到我正在使用 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()
方法。