使用DiffUtil进行列表更新,而不是简单地使用notifyDataSetChanged()。
问题解决的原因是,如果使用notifyDataSetChanged(),则整个列表会刷新,包括那些已经处于动画状态的项。而如果使用DiffUtil,则只会更新受更改影响的项,从而让动画能够继续运行。
示例代码(使用Kotlin):
首先,创建一个继承自DiffUtil.ItemCallback的类,用于比较列表项的差异:
class ItemDiffCallback : DiffUtil.ItemCallback
然后,在Activity或Fragment中,将DiffUtil类的实例保存为类成员变量:
private lateinit var diffCallback: ItemDiffCallback
初始化diffCallback,并使用它在适配器中更新列表:
diffCallback = ItemDiffCallback()
fun updateList(newList: List
其中,newList是新的列表数据,list是当前适配器内部维护的列表数据。在更新列表时,会创建一个差异比较对象diffCallback,并调用DiffUtil.calculateDiff()方法来计算它们之间的差异。然后,使用得到的差异结果diffResult来更新列表,包括清除原有数据、添加新数据以及调用dispatchUpdatesTo()方法来触发动画的运行。