0

假设我有一个同质项目列表,在我的活动生命周期中,用户交互或操作系统事件可能会改变这些项目。Activity包含 a ,FragmentPager其中显示了许多ListFragments。

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

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

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

  • 应用刚启动的时候,有些fragment还没有被FragmentPager创建,所以通知他们是不可能的。
  • 在浏览片段时,其中一些会暂停。在这种状态下,他们无法更新他们的列表。在这种情况下,他们是否应该与观察者断开连接?这将导致:
  • 当发生变化时,当一个片段断开连接时,它基本上会错过它。
  • 等等...
4

3 回答 3

0

如果我理解你的ViewPager显示相同的数据(或它的一部分)但在不同的视图中。所以,我相信ViewPager当数据发生变化时不应该采取任何行动,这是适配器的责任。

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

于 2012-02-26T22:56:35.027 回答
0

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

于 2012-10-07T19:00:20.593 回答
0

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

这是我推荐的实现,因为

  1. 每个Fragments 行为都保持自包含(即,每个都是一个可重用的组件,不与任何特定的ViewPageror相关联Activity)。

  2. 它避免了必须处理Fragment您的ViewPager.

如果您需要快速修复,您可能会像 Ivan 建议的那样强制Fragments 保留在内存中ViewPager#setOffScreenPageLimit(int limit)......但是,在我看来,这并不是一个干净的解决方案。

于 2012-10-07T20:15:26.027 回答