Android Kotlin: как мне успешно удалить элемент из recyclerview, вызвать notifyItemRangeChanged() и анимировать

#android #kotlin #android-recyclerview

#Android #котлин #android-recyclerview

Вопрос:

У меня есть RecyclerView, и я пытаюсь реализовать функцию удаления. Чтобы получить правильные позиции ItemViews, я вызываю notifyItemRangeChanged() после удаления. Однако, когда я это делаю, классная анимация ItemView, скользящего вправо и удаляемого, теперь исчезает. Похоже, что notifyItemRangeChanged() отключает анимацию, созданную notifyItemRemoved() . Есть ли какой-нибудь способ, которым я могу правильно удалить анимацию и элементы?

Код действия:

         circuitsObject?.circuits?.remove(circuitsObject?.circuits?.get(position))
        recyclerView.adapter?.notifyItemRemoved(position)
        recyclerView.adapter?.notifyItemRangeChanged(position, circuitsObject?.circuits!!.size)

        if (recyclerView.adapter?.itemCount!! == 0) {
            loadEmptyUI()
        }
 

Код адаптера:

 class CircuitViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
...
itemView.setOnClickListener { clickListener(circuit) }
itemView.setOnLongClickListener {
    onLongClickListener(position)
    true
}
 

Параметр «позиция» поступает прямо из ViewHolder . Чтобы компенсировать тот факт, что позиция не соответствует индексу моих данных, я использую «notifyItemRangeChanged». Однако при этом вы избавляетесь от анимации. Поэтому мне интересно, есть ли какой-нибудь способ обойти это, чтобы у меня все еще была правильная логика позиционирования, а также анимация для удаления.

Ответ №1:

Вам не нужно звонить notifyItemRangeChanged(...) после звонка notifyItemRemoved(...) .

Комментарии:

1. Если я этого не сделаю, то порядок будет нарушен. Полученная позиция больше не соответствует одному и тому же элементу в моих данных. Имеет ли это смысл?

2. Можете ли вы показать больше кода? Я предполагаю, что вы, вероятно, используете параметр position метода onBindViewHolder в своих слушателях. Верно ли мое предположение?

3. да, я прав. Позвольте мне попробовать отредактировать еще немного кода

4. попробуйте использовать ViewHolder.layoutPosition вместо position в ваших слушателях. Это должно решить проблему несоответствия позиции индексу.

5. по какой-то причине даже после использования holder.layoutPosition вместо position значения индекса неверны и в некоторых случаях выходят за пределы диапазона.