#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 значения индекса неверны и в некоторых случаях выходят за пределы диапазона.