【问题标题】:Is notifyItemInserted expensivenotifyItemInserted 是否昂贵
【发布时间】:2015-08-24 18:52:44
【问题描述】:

我正在将我的应用程序从 sqlite 转移到 Firebase。以前我会从数据库中读取 N 个项目到一个数组列表并调用notifyItemRangeInserted。现在从 Firebase 获取数据的最便捷方式是逐个交付对象。我想知道是否有人对每个列表项调用notifyItemInserted 的成本进行了调整。这很好还是我应该批量处理我的负载?我在 RecyclerView 中显示所有内容。

【问题讨论】:

  • 好问题。有什么让你无法进行比较两者的测试吗?我很想听听结果。
  • 这里的答案将高度依赖于您的数据架构、有效负载、频率——几乎是您特定用例的每一个细节。如果您对两者进行分析,您会看到什么?

标签: android firebase android-recyclerview firebase-realtime-database


【解决方案1】:

基于 RecyclerView 的文档:

有两种不同类别的数据更改事件,项目更改结构更改项目变化是指单个项目的数据已更新但位置未发生变化结构变化在数据集中插入、移除或移动项目

notifyItemInserted : 通知所有注册的观察者该位置反映的项目已被新插入

notifyItemRangeInserted : 通知所有注册的观察者当前反映的从 positionStart 开始的 itemCount 项已经被新插入

量化和比较这两者有点棘手。

  1. 基于功能:它们似乎都执行相同的操作。它们不会更改现有项目绑定,而是更改现有项目位置。
  2. 基于通知观察者后的影响: 短时间调用notifyItemInserted 会频繁触发注册观察者。如果这些观察者正在做一些繁重的计算,那么每个项目的notifyItemInserted 将会很昂贵。

但是,如果您确实有一个范围内不连续的列表(例如删除第 1、2 和 4 项),或者如果您想同时执行插入和删除,并对其进行相应的动画处理,或者您经常修改适配器的数据集,有效的方法是实现支持库中提供的DiffUtil

大多数情况下,我们的列表完全改变,我们将新列表设置为 RecyclerView 适配器。我们调用 notifyDataSetChanged 来更新 适配器。 NotifyDataSetChanged 代价高昂。 DiffUtil 类解决了这个问题 现在的问题。它完美地完成了它的工作

您可以找到更多信息here

【讨论】:

    猜你喜欢
    • 2012-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多