我得到了这个错误。
java.lang.IndexOutOfBoundsException: Inconsistency detected. 无效项目位置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)notifyItemChanged(position)是假设列表项发生了变化而不是删除,所以它认为第一个列表中的2变成了3,但没有删除。但是,实际上你已经删除了它。因为它认为大小是4,所以它抛出indexOutOfBoundException。
结论:项目内部的数据变化用notifyItemChanged(pos:Int),项目删除用notifyItemRemoved(pos:Int)。
你的高阶函数没有什么