Android 移动项目时,DiffUtil未更新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

我在RecyclerView中实现了拖放,并使用
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]
    }

}