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