我正在将应用程序从sqlite迁移到Firebase。以前,我将从数据库读取N个项目到arraylist并调用notifyItemRangeInserted。现在,从Firebase获取数据的最便捷方法是逐个传递对象。我想知道是否有人负担了为每个列表项调用notifyItemInserted的费用。可以吗?还是应该分批装载?我正在RecyclerView中显示所有内容。

最佳答案

根据RecyclerView的文档:


  数据更改事件有两类,项目更改和结构更改。物料更改是指单个物料的数据已更新但未发生位置更改的情况。结构更改是指在数据集中插入,删除或移动项目的时间。


notifyItemInserted:通知所有注册的观察者新近插入位置的物品

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

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


基于功能:两者似乎都执行相同的操作。他们不更改现有项目的绑定,而是更改现有项目的位置。
根据通知观察者后的影响:短时间调用notifyItemInserted会频繁触发注册的观察者。如果这些观察者正在进行大量计算,则每个项目的notifyItemInserted将会很昂贵。


但是,如果您的列表确实不在某个范围内(例如,删除项目1、2和4),或者想要同时执行插入和删除操作,并对其进行相应的动画处理,或者您经常修改适配器的数据集,则效率很高方式将是实施支持库中可用的DiffUtil


  大多数情况下,我们的列表会完全更改,因此我们将新列表设置为
  RecyclerView适配器。我们调用notifyDataSetChanged进行更新
  适配器。 NotifyDataSetChanged非常昂贵。 DiffUtil类解决了
  现在的问题。它做得很好


您可以找到更多信息here

关于android - notifyItemInserted是否昂贵,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32189617/

10-10 03:25