BaseRecyclerViewAdapterHelper icon indicating copy to clipboard operation
BaseRecyclerViewAdapterHelper copied to clipboard

3.0.4版本DiffUtil,如果只修改了其中一个Item的某个字段的内容,则不会刷新页面。

Open temporarydev opened this issue 4 years ago • 7 comments

3.0.4版本DiffUtil,如果只修改了其中一个Item的某个字段的内容,则不会刷新页面。DiffCallBack中areContentsTheSame方法返回内容相同,而且oldItem和newItem的数据尽然都是修改过后的。 如图,已经修改了amount字段从3522到352,但日志显示新旧数据尽然都是修改后的352。 捕获

DiffCallback: 捕获

设置数据(result为数据库获取的结果): 捕获

temporarydev avatar Jul 01 '20 05:07 temporarydev

+1

330676687 avatar Jul 04 '20 11:07 330676687

+1

AttackPangHu avatar Oct 24 '20 07:10 AttackPangHu

我也是,斷點進去看到裡面的值變了,但是adapter沒有刷新

AttackPangHu avatar Oct 24 '20 07:10 AttackPangHu

断点到submitList方法里,这里传入的newList居然和adapter.getData是一样的。问题出现在这里,应该是引用了同一个data,导致出的问题

AttackPangHu avatar Oct 24 '20 11:10 AttackPangHu

是的,今天搞了半天,必须要深拷贝才行,否则修改的肯定是同一个内存地址值的数据

HeroLBJ avatar Mar 30 '21 13:03 HeroLBJ

这个不是库的问题,可以看一下DiffUtil实现,Android官方库中是AsyncListDiffer.java, brvah是在BrvahAsyncDiffer.kt 比较时使用的oldList其实就是getData()中的数据,newList是你调用setDiffNewData时传入的数据。

所以直接修改adapter中引用的数据,然后使用diffUtil比较是无效的。这个如果之前使用notifyDataChange或者notifyItemChange方法做局部刷新迁移到diffutil会比较容易碰到这个坑。

minwang1 avatar Apr 13 '21 07:04 minwang1

me too

wushange avatar Mar 02 '22 02:03 wushange