RecyclerView notifyItemRangeChanged не показывает новые данные

Я столкнулся с проблемой с RecyclerView#Adapter относительно notifyItemRangeChanged, Кажется, что если Adapter считает, что имеет размер 0 с последнего звонка getItemCountа потом я звоню Adapter#notifyItemRangeChanged(0, 1), Adapter будет просто игнорировать вызов (это не приведет, например, к вставке нового элемента).

Это ожидаемое поведение?

1 ответ

Решение

Это ожидаемое поведение?

Краткий ответ: да.

Из документов на notifyDataSetChanged() (да, другой метод, я знаю, но просто ссылаюсь на него здесь, поскольку он объясняет разницу между изменениями элементов и структурными изменениями):

Существует два разных класса событий изменения данных, изменений элементов и структурных изменений. Изменения элемента происходят, когда данные одного элемента обновляются, но позиционные изменения не происходят. Структурные изменения - это когда элементы вставляются, удаляются или перемещаются в наборе данных.

Теперь прочитайте документацию по notifyItemRangeChanged() (мой акцент):

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

Это должно ответить на ваш вопрос. Вы делаете структурное изменение (то есть, вы добавляете элемент), следовательно, notifyItemRangeChanged() не подходящий метод для вызова. Вместо этого вы должны позвонить notifyItemRangeInserted() (или его единственного эквивалента), который указывает на структурные изменения.

Другие вопросы по тегам