Ответ
DiffUtil — это утилита для вычисления различий между двумя списками и анимированного обновления RecyclerView. Для работы с DiffUtil часто используют делегаты:
- ListAdapter — абстрактный класс, который автоматически обрабатывает DiffUtil. Нужно реализовать
DiffUtil.ItemCallback<T>:
class UserAdapter : ListAdapter<User, UserViewHolder>(UserDiffCallback()) {
class UserDiffCallback : DiffUtil.ItemCallback<User>() {
override fun areItemsTheSame(oldItem: User, newItem: User) = oldItem.id == newItem.id
override fun areContentsTheSame(oldItem: User, newItem: User) = oldItem == newItem
}
}
- AsyncListDiffer — низкоуровневая реализация, используется внутри ListAdapter. Можно применять напрямую:
val differ = AsyncListDiffer(this, UserDiffCallback())
differ.submitList(newList)
- SortedList (устаревший) — автоматически сортирует элементы и уведомляет об изменениях. Сейчас рекомендуется использовать ListAdapter.
ListAdapter предпочтительнее, так как он абстрагирует работу с AsyncListDiffer и предоставляет чистый API.