2012-02-26 73 views
0

比方说,我有一个同质项目列表,这些项目可能会在用户交互或操作系统事件的活动生命周期中进行更改。 Activity包含FragmentPager,其显示了多个ListFragment保持FragmentPager中的ListFragments同步

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

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

目前我有某种观察员对象,当更改并随后通知连接的片段时会收到通知。但有几个问题:

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

回答

0

如果我明白你的ViewPager显示了相同的数据(或它的一部分),但在不同的看法。所以,我相信ViewPager不应该在数据更改时采取任何行动,它是Adapter的责任。

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

0

你可以保留你的数据在Application类中,当数据改变时只更新可见片段,并且总是要求新数据片段的onResume(),它会这样做

0

我会做的是每个ListFragment使用Loader加载其数据。然后,不要让观察者通知Fragment(可能已被杀死)来刷新其数据,而是要为每个Loader注册一个观察者,以便知道数据源何时发生更改,并在检测到数据源时重新进行查询。 (如果您的数据源是SQLite数据库,并且您使用的是ContentProvider,则CursorLoader将为您执行所有操作)。

这是我建议因为

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

  2. 它避免了您ViewPager内应对潜在破坏Fragment S的复杂性。

如果你需要速战速决,你很可能逃脱迫使Fragment S使用ViewPager#setOffScreenPageLimit(int limit)伊凡建议留在记忆......然而,这并不像清洁在我看来,解决方案。