Android 中数据与 UI 之间松耦合的最佳实践 - Adapter、Filter、CursorLoader 和 ContentProvider

Best practice for loose coupling between data & UI in Android - Adapter, Filter, CursorLoader and ContentProvider

假设我们有一个 Activityn TextView 代表一行注释。这些笔记存储在某个地方(本地数据库、网络等),每次调用 onResume() 时,都会根据存储的数据绘制适当数量的 TextView

现在,假设用户想要删除一条笔记,解析特定 TextView 回到其存储实体的最佳方式是什么?

目前,我知道的唯一方法是使用 View.Tag,并让一些管理人员将其转换为数据实体,但它看起来相当混乱。

还有其他选择吗?

在Android中,Adapter充当视图和数据模型之间的桥梁。您可以在 ListViewGridView 中显示 n TextViews,并且当用户添加或删除注释,首先更新本地或服务器数据库。 Web 服务调用完成后 and/or 本地数据库更新,新数据被添加到底层 Adapter。然后通过调用 adapter.notifyDataSetChanged() 刷新 View。这就是实现它的方法。

方法:

  • 如果更新本地 SQLite 数据库,您可以考虑使用 CursorAdpater 保存 View 的数据,因为它直接映射中的条目 本地数据库到 View.
  • 如果使用ContentProvider,甚至可以合并 一个 CursorAdapter 和一个 LoaderManager 和一个 CursorLoader: 这些插入 Activity / Fragment 生命周期和监控 已发布更改的基础 ContentProvider 自动转到单独线程上的 View
  • 也可以使用 FilterAdapter 一起定义一个动态机制 即时对数据条目进行排序。过滤由 Filter 在单独的线程上,根据用户输入的查询, 可能在一个 AutoCompleteTextView.

参考文献:

  • 请参阅检索列表 联系人 教程。此处的示例从 联系人 ContentProvider 基于动态的字母顺序搜索 用户。它利用 CursorAdapterCursorLoaderLoaderManager 监控和更新数据,并显示 搜索结果 ListView.
  • 另请参阅 Android Realtime (Instant) Search with Filter Class 示例,其中显示了如何使用 Filter
  • Android AutoCompleteTextView with Custom Adapter filtering.
  • Android AutocompleteTextView using ArrayAdapter and Filter.