Какие знаешь Delegate Adapter’ы для DiffUtil

«Какие знаешь Delegate Adapter’ы для DiffUtil» — вопрос из категории UI и Views, который задают на 23% собеседований Android Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

DiffUtil — это утилита для вычисления различий между двумя списками и анимированного обновления RecyclerView. Для работы с DiffUtil часто используют делегаты:

  1. 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
    }
}
  1. AsyncListDiffer — низкоуровневая реализация, используется внутри ListAdapter. Можно применять напрямую:
val differ = AsyncListDiffer(this, UserDiffCallback())
differ.submitList(newList)
  1. SortedList (устаревший) — автоматически сортирует элементы и уведомляет об изменениях. Сейчас рекомендуется использовать ListAdapter.

ListAdapter предпочтительнее, так как он абстрагирует работу с AsyncListDiffer и предоставляет чистый API.