如何在不通知整个项目的情况下更新在recyclerview的特定位置的数据?(如文字、图像等) &g



我需要在回收者视图中更新项目中的数据的功能。现在,如果我们通知整个项目,它会显示一些波动,我们希望避免在UI上刷新整个项目。

我正在使用diff utils的ListAdapter .

有很多方法可以达到你的目标。

  1. 自我管理项目。适配器不知道项目的任何内容,它只把项目放到RecyclerView中。内容由项目本身管理,所以你的问题已经解决了。
  2. 自定义适配器。适配器对每个项目都有复杂的了解,并可以相应地更新选定的项目。
  3. AsyncListDiffer你可以添加不同到你的适配器,它会照顾不更新不需要更新的部分。

没有看到你的代码,我们无法判断哪种方式最适合你,但我想在已经工作的代码上添加差异是最简单的。

您需要创建自定义适配器:

https://developer.android.com/develop/ui/views/layout/recyclerview

如果您正在谈论更新特定的列表项,并且您不使用DiffUtil(它将为您处理它),那么您需要在Adapter上调用适当的notify*方法。

它们分为两类,项目变更事件(项目列表保持不变,但其中一个或多个项目的显示数据发生变化)和结构变更事件(项目的实际列表以某种方式发生变化,例如插入/删除或重新排序)。

我假设您只想更新一个项目的显示数据,因此您应该使用notifyItemChangednotifyItemRangeChanged方法之一来通知适配器需要更新某个项目(或项目范围)。如果这些项目中的任何一个目前正在ViewHolder中显示,那么onBindViewHolder将再次为这些项目调用-这是您根据所显示的项目设置所有文本,图像等的地方。因此,您将使用当前数据更新它们。

这两种方法都有一个采用有效载荷Object/Any的版本,在那里你可以传入一些数据在部分绑定中使用-基本上,onBindViewHolder可以接收该数据并更智能地更新,这意味着你可以通过传入一些东西并在绑定过程中检查它来避免像重新加载图像等事情。如果你需要,可以在onBindViewHolder的其他版本中实现更多信息。