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

问题描述 投票:0回答:1

我得到了这个错误。

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)
        }

它崩溃了,但如果我不使用那行代码,它就能正常工作,没有点击。

这是一个简单的应用程序,我想更新列表,当点击时删除一个项目,如果可能的话删除所有的列表。

android kotlin android-recyclerview recycler-adapter
1个回答
0
投票

我想问题是这样的...

你的 removeItemAt 适配器中的方法使用 list.Remove(element: Int) 指的是列表中的一个实际元素,而非 list.removeAt(position: Int) 这实际上是按位置删除项目。


0
投票

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)。

你的高阶函数没有什么

© www.soinside.com 2019 - 2024. All rights reserved.