DiffUtil не обновляет окно повторного просмотра при перемещении элементов - PullRequest
0 голосов
/ 14 апреля 2019

Я реализовал перетаскивание в RecyclerView и использую DiffUtil для отправки обновлений. Но, похоже, что элементы перемещаются как-то не DiffUtil на адаптер. Однако, если я позвоню notifyItemMoved() на адаптер, он будет работать.

В адаптере

fun updateItems(items: List<Item?>) {
        val diffResult = DiffUtil.calculateDiff(MyDiffCallback(this.items, items), true)
        diffResult.dispatchUpdatesTo(this)
        this.items = items
    }

Репозиторий

fun swap(fromPosition: Int, toPosition: Int) {
        val list = liveItems.value
        Collections.swap(list, fromPosition, toPosition)
        liveItems.value = list
    }

Пункт

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]
    }

}

Обратите внимание на переменную id is specific to each Item`.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...