3

我在 ListView 中有一个我想要的项目列表,我可以让它在每次列表增长时设置一个自定义适配器,但程序流程有点奇怪,我在持久性方面存在问题。(如果我切换选项卡,UI 会用一个空的 ListView 重建。)

现在,在我的日常工作中,我是一名 C# 开发人员,所以当我看到这个问题时,我看到一个 WPF ListView 绑定到一个 ObservableCollection。Android/Java 是否有类似的东西,UI 元素和数据结构之间的“即发即弃”连接?

4

2 回答 2

2
  • 无需每次更改数据时都更换适配器。适配器在数据和视图之间“适应”。只要适配的方式不改变,就不需要改变适配器。

  • 活动/片段生命周期不一定是数据收集的生命周期。例如,您可以在某处创建单例数据集合,并使用适配器始终显示该集合。.notifyDataSetChanged()如果您更改了数据,请调用适配器。

  • Android 中的持久数据收集可能最好由数据库支持。查看LoaderManager&ContentProvider以提供和加载数据,然后通过CursorAdapter.

没有自动方法可以在 Activity / Fragment / .. 生命周期之外保留大量可用数据,并且它可能会变得非常复杂,但如果您想将数据保留比给定生命周期更长的时间,这基本上就是您必须做的。Singletons, Activity#onSaveInstanceState(), Activity#getLastNonConfigurationInstance(), Fragment#setRetainInstance(), ... 是将数据保存在内存中的有用实用程序,数据库适用于持久数据。

于 2013-09-10T14:30:12.147 回答
1

您必须自己做一些工作,但这是可能的。使用ContentProvider作为您的数据源。数据的存储方式取决于您。我更喜欢 SQLite-DB。内容提供者可以添加ContentObservers。(请参阅此相关问题。)

您可以编写 CourserAdapter 从您的内容提供者那里获取数据。并且您的 ContentObserver 应该在您的适配器上调用 notifyDataSetChanged() 。这会关闭圆圈,并且您的 UI 会自行刷新。

除了 zapls 答案:您还可以编写一个包含 BroadcastReceiver 的适配器。当您的 DataSource 更改时,您可以发送LocalBroadcast。广播处理程序只调用适配器的 notifyDataSetChanged()。我认为这可以解决大多数生命周期问题,因为只有活动元素才能获得广播。

谷歌文档有一个这样的解决方案的例子。

于 2013-09-10T14:38:56.797 回答