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)
当 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 异常
我做错了什么?
【问题讨论】:
我不确定,但我认为在列表中添加或删除项目后,您必须调用“adapter.notifyDataSetChanged();” 可能不是问题,但您的areContentsTheSame()
应该是oldList[oldItemPosition] == newList[newItemPosition]
,假设Item
是data class
@MohamedMohsin 同样的事情
【参考方案1】:
如果您要删除一个项目,您必须向您的适配器提交一个新列表。
您的适配器必须继承自 :ListAdapter<T,K>(YourDiffcallback())
adapter.submitList(list)
【讨论】:
以上是关于Android DiffUtil::onBindViewHolder 返回从列表中移除的位置的主要内容,如果未能解决你的问题,请参考以下文章
Android 逆向Android 权限 ( Android 逆向中使用的 android.permission 权限 | Android 系统中的 Linux 用户权限 )