gpt4 book ai didi

java - 当我的 ListFragment 从返回堆栈返回到布局时,如何刷新我的 ListFragment?

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:33:48 27 4
gpt4 key购买 nike

首先我应该提到我使用 ActionBarSherlock 库来实现向后兼容性。

我有一个添加 ListFragment 的 Activity 当它第一次启动时。我有一个自定义 Loader我实现并遵循 AsnycTaskLoader example很接近的。我的ListFragment实现 LoaderCallbacks<Cursor>界面。添加 fragment (onCreateLoader()onLoaderFinished())和替换 fragment (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); ,回调被调用,但我的列表仍然是空的(虽然有数据,但 View 没有刷新)。

当我的 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);
}

一些注意事项:

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

最佳答案

Eureka !!!我发现了它(当然是偶然发现的)

TL;DR;

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

尝试详细解释:

嗯,我这样做是因为我认为在 onCreate() 方法中不可能通过 getActivity() 获取上下文。事实证明,您甚至可以在 onActivityCreated() 被调用之前 getActivity()

但我无法真正解释为什么这现在有效,因为 Loader 有它自己的 DatabaseAdapter 对象,它用来检索数据。如果我猜的话,我会说两个数据库适配器 ( the database is cached ) 返回相同的数据库对象。这意味着当我在 onDestroyView() 中关闭一个时,另一个也关闭并且游标数据集变得无效,这导致 ListView 为空。加载器不会重新加载,因为它认为数据没有改变。

但即使是这个解释也不能完全让我满意,因为我尝试过的一些建议的解决方案,比如每次都强制重启加载程序,都没有用。 (在loadInBackground()方法中,每次都会创建一个新的DatabaseAdapter)。

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

感谢大家对此的帮助!

关于java - 当我的 ListFragment 从返回堆栈返回到布局时,如何刷新我的 ListFragment?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10842272/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com