Android DiffUtil::onBindViewHolder 返回从列表中移除的位置

Posted

技术标签:

【中文标题】Android DiffUtil::onBindViewHolder 返回从列表中移除的位置【英文标题】:Android DiffUtil :: onBindViewHolder returning the position removed from the list 【发布时间】:2020-06-21 08:06:04 【问题描述】:

单击项目时,我试图从适配器中删除项目 显示器做对了 但是当我点击最后一项时,我得到 IndexOutOfBound Exception

我的差异工具如下

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)
    

onBindViewHolderdispatchUpdatesTo

之后触发
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 异常

我做错了什么?

【问题讨论】:

我不确定,但我认为在列表中添加或删除项目后,您必须调用“adapter.notifyDataSetChanged();” 可能不是问题,但您的areContentsTheSame() 应该是oldList[oldItemPosition] == newList[newItemPosition],假设Itemdata class @MohamedMohsin 同样的事情 【参考方案1】:

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

adapter.submitList(list)

【讨论】:

以上是关于Android DiffUtil::onBindViewHolder 返回从列表中移除的位置的主要内容,如果未能解决你的问题,请参考以下文章

Android 逆向Android 权限 ( Android 逆向中使用的 android.permission 权限 | Android 系统中的 Linux 用户权限 )

android 21 是啥版本

Android逆向-Android基础逆向(2-2)

【Android笔记】android Toast

图解Android - Android核心机制

Android游戏开发大全的目录