假设我有一个同源项列表,这些项可能会在我的Activity的生命周期中通过用户交互或OS事件进行更改。 Activity
包含FragmentPager
,其中显示了一些ListFragment
s。
这些片段共享前面提到的数据,但以不同的方式显示它们。例如。它们在排序顺序上不同或仅显示数据的子集。目前,每个片段都保留一个单独的列表,其中包含各自顺序的数据的相应部分。
当数据发生变化时,基本上每个片段都必须更新。这意味着从某些片段中获取或添加/删除项目。 保持不同片段中的数据一致的最佳做法是什么?
目前我有一些观察者对象,当某些东西发生变化时会通知它,然后通知连接的片段。但是有一些问题:
答案 0 :(得分:0)
如果我理解你的ViewPager
显示相同的数据(或它的部分),但是在不同的视图中。因此,我相信ViewPager
在数据发生变化时不应以任何方式行事,它是适配器的责任。
关于以下几点,你说:
a)在ViewPager
内创建片段可由您管理。只需查看ViewPager::setOffscreenPageLimit(int limit)
方法的javadoc即可。
b)我认为当数据发生变化但片段处于暂停状态时,你不应对UI做任何事情。如果要更新,请在onResume()中进行更新。或者更好地在DB中设置一些字段(如果有)以“更新当前”状态,并在出现Activity
(Fragment
)时进行检查。
c)与之前的选项一样 - 如果片段断开连接则忽略更新。或者,如果您真的对该更新感兴趣,请使用粘性BroadcastReciver
(小心粘性BR是昂贵的东西)
答案 1 :(得分:0)
您可以将数据保存在Application类中,仅在数据发生更改时更新可见片段,并始终在Fragment的onResume()中请求新数据,这样做
答案 2 :(得分:0)
我要做的是让每个ListFragment
使用Loader
来加载其数据。然后,不是让观察者通知Fragment
(可能已被杀死)来刷新其数据,而是为每个Loader
注册一个观察者,以便它知道数据源何时发生了变化,并且检测到一个时重新查询。 (如果您的数据源是SQLite数据库并且您使用的是ContentProvider
,CursorLoader
将为您完成所有这些操作。
这是我建议的实施,因为
每个Fragment
行为都是自包含的(即每个行为都是可重复使用的组件,不依赖于任何特定的ViewPager
或Activity
)。
它避免了在Fragment
中处理可能被破坏的ViewPager
的复杂性。
如果你需要一个快速解决方案,你可能会因使用Fragment
迫使ViewPager#setOffScreenPageLimit(int limit)
继续留在内存中,正如Ivan建议的那样...但是,这并不是一个干净的在我看来解决方案。