当从后端堆栈返回布局时,如何刷新ListFragment?

cod*_*ser 9 java android listview actionbarsherlock android-support-library

首先我要提一下,我正在使用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);
}
Run Code Online (Sandbox Code Playgroud)

稍后,将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);
}
Run Code Online (Sandbox Code Playgroud)

一些说明:

  1. 我无法使用setListShown(true)示例中的方法,因为我得到的IllegalStateException是它不能与自定义内容视图一起使用.
  2. AccountsCursorAdapter扩展了一个SimpleCursorAdapter并仅修改了该bindView()方法.

cod*_*ser 5

尤里卡!我找到了(当然是偶然的)

TL; DR;

AccountsListFragment中,我现在AccountsDatabaseAdapteronCreate()方法中创建我的数据库适配器()并在方法中关闭它,onDestroy()现在它可以工作.以前我在onActivityCreated()关闭中创建我的适配器onDestroyView().请注意,我不是指代ListAdapter,而是指我的数据库接口AccountsDbAdapter.

尝试很长的解释:

嗯,我这样做是因为我认为getActivity()onCreate()方法中不可能获得上下文.事实证明你getActivity()甚至可以在onActivityCreated()被召唤之前.

但我无法解释为什么现在这样可行,因为它Loader有自己的DatabaseAdapter对象,用于检索数据.如果我猜,我会说两个数据库适配器都返回相同的数据库对象(数据库被缓存).这意味着当我关闭一个时onDestroyView(),另一个也关闭,光标数据集变为无效,这导致空列表视图.加载程序不会重新加载,因为它认为数据没有更改.

但即使这样的解释也不能完全满足我的要求,因为我尝试过的一些建议的解决方案每次强制重新启动加载器都不起作用.(在该loadInBackground()方法中,DatabaseAdapter每次都创建一个新的).

无论如何,如果您碰巧对正在发生的事情有了更好的了解,请在评论中聆听.

感谢大家对此的帮助!