【问题标题】:Does Android development have any concept analogous to WPF data binding?Android开发有没有类似于WPF数据绑定的概念?
【发布时间】:2013-09-11 03:19:59
【问题描述】:

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

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

【问题讨论】:

    标签: android


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

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

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

    没有自动方法可以在 Activity / Fragment / .. 生命周期之外保留大量可用数据,这可能会变得相当复杂,但如果您想将数据保留的时间超过给定的时间,这基本上就是您必须做的事情生命周期。单例、Activity#onSaveInstanceState()Activity#getLastNonConfigurationInstance()Fragment#setRetainInstance()、... 是将数据保存在内存中的有用实用程序,数据库适用于持久数据。

    【讨论】:

    • LocalBroadcasts 和 BroadcastReceiver 将保证只有活动组件才能收到通知。如果需要,此组件可以重新获取数据。这将是解决生命周期问题的好方法。
    【解决方案2】:

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

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

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

    谷歌文档中有一个solution 的示例。

    【讨论】:

    • "ContentObserver 应该在你的适配器上调用 notifyDataSetChanged()" 小心。适配器在 UiThread 中重新加载数据,不再建议通知适配器有关更改。 Loader 得到通知并重新加载异步,然后告诉适配器新数据。
    猜你喜欢
    • 2011-08-25
    • 2012-07-26
    • 2021-11-19
    • 1970-01-01
    • 2014-06-06
    • 2012-01-29
    • 1970-01-01
    • 2016-03-19
    • 1970-01-01
    相关资源
    最近更新 更多