Добавление элементов удаления из ошибки recyclerView - PullRequest
0 голосов
/ 27 мая 2020

Я получаю эту ошибку:

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

Он вылетает, но если я этого не сделаю ' Я использую эту строку кода, и она работает без щелчка.

Это простое приложение, в котором я хочу обновить список, удалить элемент при нажатии и, если возможно, удалить весь список.

Ответы [ 2 ]

0 голосов
/ 27 мая 2020

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) для удаления элемента.

Нет ничего с вашей функцией высокого порядка

0 голосов
/ 27 мая 2020

Я думаю, проблема в следующем ...

ваш метод removeItemAt в адаптере использует list.Remove(element: Int), который относится к фактическому элементу в списке, вместо list.removeAt(position: Int), который фактически удалит пункт по позиции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...