Ответ 1
Если вы просто обновляете одну часть представления, используйте notifyItemRangeChanged()
или notifyItemChanged()
вместо notifiyDataSetChanged()
. Разница здесь связана с изменениями структурных изменений и . Это находится в документации разработчиков RecyclerView.Adapter
разработчиков Android. здесь.
Вот еще один лакомый кусочек различий между двумя типами изменений:
Существуют два разных класса событий изменения данных, изменения элементов и структурные изменения. Изменения позиции - это когда один элемент имеет свой данные обновлены, но изменений позиции не произошло. структурная изменения, когда элементы вставлены, удалены или перемещены в пределах данных набор.
Это взято из вышеупомянутой страницы,
Если вы пишете адаптер, всегда будет более эффективно использовать более конкретные изменения событий, если можно. Полагаться на notifyDataSetChanged() в качестве последнего средства.
Итак, просто для того, чтобы прояснить использование notifyDataSetChanged()
в качестве last resort, и вместо этого спросите себя, можете ли вы заново сформировать один из этих методов, и если вы можете использовать его вместо:
notifyItemChanged(int)
notifyItemInserted(int)
notifyItemRemoved(int)
notifyItemRangeChanged(int, int)
notifyItemRangeInserted(int, int)
notifyItemRangeRemoved(int, int)
что имеет смысл, потому что notifyDataSetChanged()
будет в значительной степени пытаться перерисовать все на основе данных и не делать никаких предыдущих предположений на нем, в то время как другие методы будут просто искать изменения. Это означает, что адаптер должен выполнять гораздо больше работы, что не требуется. Это то, что notifyDataSetChanged()
делает:
Это событие не определяет, что изменило набор данных, заставляя любых наблюдателей предположить, что все существующие элементы и структура может быть недействительным. LayoutManagers будут вынуждены полностью перегруппироваться и ретранслировать все видимые виды.
Это также имеет смысл использовать инкрементный или диапазонный подход, потому что вы меняете текст, вам нужно получить каждый новый текст, и когда вы это сделаете, вы должны сообщить адаптеру, что вы его изменили. Теперь, если вы нажмете кнопку мыши и получите все новые текстовые значения, а также создайте новый список или что-то другое, назовите heavy notifyDataSetChanged()
.