从回收商中添加删除项目查看错误



我收到此错误:

java.lang.IndexOutOfBoundsException: 检测到不一致。无效的项目位置 29

我想这是因为我有一个函数作为我的适配器的参数,因为如果我评论该方法它有效,但我想了解为什么它不起作用......

我的适配器看起来像这样:

class MyAdapter(private val click: (position: Int) -> Unit) :
RecyclerView.Adapter<MyAdapter.ViewHolder>() {
private var list = ArrayList<Int>()
fun addItems(numberList: ArrayList<Int>) {
list.addAll(numberList)
notifyDataSetChanged()
}
fun removeItemAt(position: Int) {
list.remove(position)
notifyItemChanged(position)
}
fun removeAll() {
list.clear()
notifyDataSetChanged()
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = ViewHolder(
LayoutInflater.from(parent.context).inflate(R.layout.my_item, parent, false)
)
override fun getItemCount(): Int = list.size
override fun onBindViewHolder(holder: ListViewHolder, position: Int) {
holder.bind(list[position], position, click)
}
class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
....
fun bind(number: Int, position: Int, click: (position: Int) -> Unit) {
...
click.invoke(position)
}
....
}
}

问题是当我按如下方式设置适配器时:

adapter = MyAdapter { itemClicked ->
//I'd like to delete the item so I have adapter.deleteItem(itemClicked)
}

它会崩溃,但是如果我不使用那行代码,则无需单击即可工作。

这是一个简单的应用程序,我想更新列表,单击时删除项目,并在可能的情况下删除所有列表。

我认为问题是这个...

适配器中的removeItemAt方法使用list.Remove(element: Int)引用列表中的实际元素,而不是按位置实际删除项目的list.removeAt(position: Int)

notifyItemChanged(position: Int( -> 用于项目更改(而不是删除(。

程序做什么?

假设列表项为 (1, 2, 3, 4(

1( list.remove(position( 正在删除示例 2 中单击的项目(newList 为 1, 3, 4(

2( 通知项目已更改(位置(假设列表项已更改未删除。所以它认为第一个列表中的 2 已更改为 3 但没有删除。但是,实际上您删除了它。当它认为大小为 4 时,它会抛出 indexOutOfBoundException

结论:使用 notifyItemChanged(pos:Int( 用于项目内部的数据更改,并使用 notifyItemRemoved(pos: Int( 用于项目删除。

你的高阶函数什么都没有

相关内容

最新更新