保持片段分页器中的列表片段同步

时间:2012-02-26 22:30:05

标签: android android-fragments consistency

假设我有一个同源项列表,这些项可能会在我的Activity的生命周期中通过用户交互或OS事件进行更改。 Activity包含FragmentPager,其中显示了一些ListFragment s。

这些片段共享前面提到的数据,但以不同的方式显示它们。例如。它们在排序顺序上不同或仅显示数据的子集。目前,每个片段都保留一个单独的列表,其中包含各自顺序的数据的相应部分。

当数据发生变化时,基本上每个片段都必须更新。这意味着从某些片段中获取或添加/删除项目。 保持不同片段中的数据一致的最佳做法是什么?

目前我有一些观察者对象,当某些东西发生变化时会通知它,然后通知连接的片段。但是有一些问题:

  • 当应用程序刚刚启动时,FragmentPager尚未创建一些片段,因此无法通知它们。
  • 当扫过片段时,其中一些片段会暂停。在这种状态下,他们无法更新他们的列表。在这种情况下他们应该与观察者断开连接吗?这导致:
  • 当更改发生时,片段断开连接时,基本上会错过它。
  • 依旧......

3 个答案:

答案 0 :(得分:0)

如果我理解你的ViewPager显示相同的数据(或它的部分),但是在不同的视图中。因此,我相信ViewPager在数据发生变化时不应以任何方式行事,它是适配器的责任。

关于以下几点,你说: a)在ViewPager内创建片段可由您管理。只需查看ViewPager::setOffscreenPageLimit(int limit)方法的javadoc即可。 b)我认为当数据发生变化但片段处于暂停状态时,你不应对UI做任何事情。如果要更新,请在onResume()中进行更新。或者更好地在DB中设置一些字段(如果有)以“更新当前”状态,并在出现ActivityFragment)时进行检查。 c)与之前的选项一样 - 如果片段断开连接则忽略更新。或者,如果您真的对该更新感兴趣,请使用粘性BroadcastReciver(小心粘性BR是昂贵的东西)

答案 1 :(得分:0)

您可以将数据保存在Application类中,仅在数据发生更改时更新可见片段,并始终在Fragment的onResume()中请求新数据,这样做

答案 2 :(得分:0)

我要做的是让每个ListFragment使用Loader来加载其数据。然后,不是让观察者通知Fragment(可能已被杀死)来刷新其数据,而是为每个Loader注册一个观察者,以便它知道数据源何时发生了变化,并且检测到一个时重新查询。 (如果您的数据源是SQLite数据库并且您使用的是ContentProviderCursorLoader将为您完成所有这些操作。

这是我建议的实施,因为

  1. 每个Fragment行为都是自包含的(即每个行为都是可重复使用的组件,不依赖于任何特定的ViewPagerActivity)。

  2. 它避免了在Fragment中处理可能被破坏的ViewPager的复杂性。

  3. 如果你需要一个快速解决方案,你可能会因使用Fragment迫使ViewPager#setOffScreenPageLimit(int limit)继续留在内存中,正如Ivan建议的那样...但是,这并不是一个干净的在我看来解决方案。