【发布时间】:2012-08-28 10:41:04
【问题描述】:
我有一个 ViewPager,里面有 3 个片段。每个 Fragment 使用 AsyncTaskLoader 从数据库中获取数据。现在我想从 Fragment C 重新启动 Fragment A 的加载器,但是如果我调用
getLoaderManager.getLoader( "LOADER_A_ID" )
结果为空。 我读到每个 LoaderManager 都有一个 Activity/Fragment,每个 Fragment 都有一个自己的 LoaderManager。 有没有好主意来解决我的问题?
我会实现一个 GlobalLoaderManager,它是一个单例模式并保存片段。 ViewPager 重用了他的 Fragments,所以我在这个 Manager 中只有一个 Pager Fragment 的实例。
【问题讨论】:
-
为什么你需要重新启动一个片段的加载器,而这个片段在另一个片段中甚至不可见?您可以实现一个回调并让活动重新启动加载程序。
-
每个片段显示单独的数据,但它们在 db 模型底部连接。例如:片段 A 显示带有可烹饪状态的食谱,片段 B 显示带有数量的成分。现在我改变了一种成分的用量,并想告诉 Fragment A 重新加载他的食谱以刷新可烹饪状态。
-
我认为,一个选项是在
ViewPager和onPageSelected上设置OnPageChangeListener,您将使用该位置(如果页面位置正确(如第一个片段))+一个布尔标志。布尔标志(来自活动)将由修改数据的片段设置(当发生这种情况时)。然后在onPageSelected中,您将使用FragmentManager来获取该页面的Fragment:getSupportFragmentManager().findFragmentByTag("android:"+R.id.viewpager_id+":"+position);。然后调用一个方法来重启那个Fragment中的加载器。 -
听起来不错。我想我对此进行了测试,并对结果发表评论。谢谢。
-
我对一些旧代码进行了小幅调整,以向您展示如何执行我上面所说的操作。你可以在这里找到它gist.github.com/3511928
标签: android android-fragments asynctaskloader