Android 移动项目时,DiffUtil未更新recyclerview
我在RecyclerView中实现了拖放,并使用Android 移动项目时,DiffUtil未更新recyclerview,android,android-recyclerview,Android,Android Recyclerview,我在RecyclerView中实现了拖放,并使用DiffUtil发送更新。但似乎项目移动不是由DiffUtil发送到适配器的。但是,如果我在适配器上调用notifyItemMoved(),它就会工作 适配器中的 fun updateItems(items: List<Item?>) { val diffResult = DiffUtil.calculateDiff(MyDiffCallback(this.items, items), true) dif
DiffUtil
发送更新。但似乎项目移动不是由DiffUtil
发送到适配器的。但是,如果我在适配器上调用notifyItemMoved()
,它就会工作
适配器中的
fun updateItems(items: List<Item?>) {
val diffResult = DiffUtil.calculateDiff(MyDiffCallback(this.items, items), true)
diffResult.dispatchUpdatesTo(this)
this.items = items
}
项目
data class Item(val id: String, @StringRes val title: Int, @DrawableRes val icon: Int) {
override fun equals(other: Any?): Boolean {
if (this === other) return true
if (javaClass != other?.javaClass) return false
other as Item
if (id != other.id) return false
if (title != other.title) return false
if (icon != other.icon) return false
return true
}
override fun hashCode(): Int {
var result = id.hashCode()
result = 31 * result + title
result = 31 * result + icon
return result
}
}
MyDiffCallback
class MyDiffCallback(private val oldList: List<Item?>?, private val newList: List<Item?>) :
DiffUtil.Callback() {
override fun getOldListSize(): Int {
return oldList?.size ?: 0
}
override fun getNewListSize(): Int {
return newList.size
}
override fun areItemsTheSame(oldItemPosition: Int, newItemPosition: Int): Boolean {
return oldList!![oldItemPosition]!!.id == newList[newItemPosition]!!.id
}
override fun areContentsTheSame(oldItemPosition: Int, newItemPosition: Int): Boolean {
return oldList!![oldItemPosition]!! == newList[newItemPosition]
}
}
类MyDiffCallback(私有值oldList:List?,私有值newList:List):
DiffUtil.Callback(){
重写getOldListSize():Int{
返回旧列表?大小?:0
}
重写getNewListSize():Int{
返回newList.size
}
覆盖乐趣项相同(oldItemPosition:Int,newItemPosition:Int):布尔值{
返回oldList!![oldItemPosition]!!.id==newList[newItemPosition]!!.id
}
覆盖相同的内容(oldItemPosition:Int,newItemPosition:Int):布尔值{
返回oldList!![oldItemPosition]!!==newList[newItemPosition]
}
}
请注意,
id
变量是特定于每个
项的。似乎您正在将一个NavDiffCallback
实例传递给calculateDiff
,但您的回调类名为MyDiffCallback
@earthw0rmjim,这是我在更改代码以将其发布到此处时犯的错误。我已经更正了,谢谢。似乎您正在将一个NavDiffCallback
实例传递给calculateDiff
,但是您的回调类名为MyDiffCallback
@earthw0rmjim,这是我在更改代码以将其发布到此处时犯的错误。我已经改正了,谢谢。
class MyDiffCallback(private val oldList: List<Item?>?, private val newList: List<Item?>) :
DiffUtil.Callback() {
override fun getOldListSize(): Int {
return oldList?.size ?: 0
}
override fun getNewListSize(): Int {
return newList.size
}
override fun areItemsTheSame(oldItemPosition: Int, newItemPosition: Int): Boolean {
return oldList!![oldItemPosition]!!.id == newList[newItemPosition]!!.id
}
override fun areContentsTheSame(oldItemPosition: Int, newItemPosition: Int): Boolean {
return oldList!![oldItemPosition]!! == newList[newItemPosition]
}
}