0

单击项目时,我试图从适配器中删除项目显示正在做正确的事情,但是当我单击最后一个项目时,出现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 异常

我做错了什么 ?

4

1 回答 1

0

如果您要删除一个项目,您必须向您的适配器提交一个新列表。您的适配器必须继承自:ListAdapter<T,K>(YourDiffcallback())

adapter.submitList(list)
于 2020-03-09T14:48:30.040 回答