我在 ListView 中有一个我想要的项目列表,我可以让它在每次列表增长时设置一个自定义适配器,但程序流程有点奇怪,我在持久性方面存在问题。(如果我切换选项卡,UI 会用一个空的 ListView 重建。)
现在,在我的日常工作中,我是一名 C# 开发人员,所以当我看到这个问题时,我看到一个 WPF ListView 绑定到一个 ObservableCollection。Android/Java 是否有类似的东西,UI 元素和数据结构之间的“即发即弃”连接?
我在 ListView 中有一个我想要的项目列表,我可以让它在每次列表增长时设置一个自定义适配器,但程序流程有点奇怪,我在持久性方面存在问题。(如果我切换选项卡,UI 会用一个空的 ListView 重建。)
现在,在我的日常工作中,我是一名 C# 开发人员,所以当我看到这个问题时,我看到一个 WPF ListView 绑定到一个 ObservableCollection。Android/Java 是否有类似的东西,UI 元素和数据结构之间的“即发即弃”连接?
无需每次更改数据时都更换适配器。适配器在数据和视图之间“适应”。只要适配的方式不改变,就不需要改变适配器。
活动/片段生命周期不一定是数据收集的生命周期。例如,您可以在某处创建单例数据集合,并使用适配器始终显示该集合。.notifyDataSetChanged()
如果您更改了数据,请调用适配器。
Android 中的持久数据收集可能最好由数据库支持。查看LoaderManager
&ContentProvider
以提供和加载数据,然后通过CursorAdapter
.
没有自动方法可以在 Activity / Fragment / .. 生命周期之外保留大量可用数据,并且它可能会变得非常复杂,但如果您想将数据保留比给定生命周期更长的时间,这基本上就是您必须做的。Singletons, Activity#onSaveInstanceState()
, Activity#getLastNonConfigurationInstance()
, Fragment#setRetainInstance()
, ... 是将数据保存在内存中的有用实用程序,数据库适用于持久数据。
您必须自己做一些工作,但这是可能的。使用ContentProvider作为您的数据源。数据的存储方式取决于您。我更喜欢 SQLite-DB。内容提供者可以添加ContentObservers。(请参阅此相关问题。)
您可以编写 CourserAdapter 从您的内容提供者那里获取数据。并且您的 ContentObserver 应该在您的适配器上调用 notifyDataSetChanged() 。这会关闭圆圈,并且您的 UI 会自行刷新。
除了 zapls 答案:您还可以编写一个包含 BroadcastReceiver 的适配器。当您的 DataSource 更改时,您可以发送LocalBroadcast。广播处理程序只调用适配器的 notifyDataSetChanged()。我认为这可以解决大多数生命周期问题,因为只有活动元素才能获得广播。
谷歌文档有一个这样的解决方案的例子。