Android DiffUtil :: onBindViewHolder, возвращающий позицию, удаленную из списка - PullRequest
0 голосов
/ 09 марта 2020

Я пытаюсь удалить элементы из адаптера при нажатии элемента. Дисплей работает правильно, но когда я щелкаю последний элемент, я получаю исключение IndexOutOfBound

моя разность использует ниже

class ItemListDiffUtilCallBack(val oldList: List<Item?>,
                                     val newList: List<Item?>) : DiffUtil.Callback() {

    override fun areItemsTheSame(oldItemPosition: Int, newItemPosition: Int): Boolean
            = oldList[oldItemPosition]?.Id == newList[newItemPosition]?.Id

    override fun getOldListSize() = oldList.size

    override fun getNewListSize() = newList.size

    override fun areContentsTheSame(oldItemPosition: Int, newItemPosition: Int): Boolean
            = oldList[oldItemPosition]?.isEnrolled == newList[newItemPosition]?.isEnrolled

    override fun getChangePayload(oldItemPosition: Int, newItemPosition: Int): Any? {
        return super.getChangePayload(oldItemPosition, newItemPosition)
    }
}

так я обновляю список, в котором newList удаляет из него Предмет.

На дисплее удаляется Предмет со значением по умолчанию, как и предполагалось

 private fun updateList(newList: MutableList<Item?>) {
        val oldList = itemList.toMutableList()
        itemList.clear()
        itemList.addAll(newList)
        val result = DiffUtil.calculateDiff(ItemListDiffUtilCallBack(oldList, itemList))
        result.dispatchUpdatesTo(this@ItemRecyclerViewAdapter)
    }

когда onBindViewHolder получить триггер после dispatchUpdatesTo

override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {

        if (holder is ItemViewHolder) {
            val Item = itemList[position] 
            holder.setItem(Item)

            val myButtonListener = View.OnClickListener {
                itemList[position]?.Id?.let { Id ->
                    listener.onItemClick(Id)
                }
            }
            holder.setButtonClickListener(myButtonListener )
        } 
    }

val Item = itemList [position] itemList по-прежнему имеют размер до обновления.

И когда я щелкаю последний элемент, чтобы удалить его,

itemList [position] ?. Id? .Let { itemList [position] позиция возвращает последний элемент старого списка, поэтому я получаю исключение IndexOutOfBound

Что я сделал не так?

1 Ответ

0 голосов
/ 09 марта 2020

Если вы удаляете элемент, вы должны отправить новый список вашему адаптеру. Ваш адаптер должен наследовать от :ListAdapter<T,K>(YourDiffcallback())

adapter.submitList(list)
...