DiffUtil
— это утилита в Android, предназначенная для вычисления различий между двумя списками и эффективного обновления RecyclerView
. Она помогает избежать перерисовки всех элементов списка при изменении данных, обновляя только те элементы, которые действительно изменились. Это значительно улучшает производительность.
Сравнение списков:
DiffUtil использует алгоритм Eugene W. Myers для нахождения минимального числа изменений (добавлений, удалений, перемещений) между старым и новым списком.
Вычисление различий:
Результат возвращается в виде DiffResult
, который содержит информацию о:
Применение изменений:
Полученный DiffResult
можно применить к RecyclerView.Adapter
, чтобы обновить список анимированно и эффективно.
Допустим, у нас есть список строк, и мы хотим обновить его с минимальными затратами:
class StringAdapter(private var items: List<String>) : RecyclerView.Adapter<StringAdapter.ViewHolder>() {
fun updateList(newItems: List<String>) {
val diffResult = DiffUtil.calculateDiff(object : DiffUtil.Callback() {
override fun getOldListSize() = items.size
override fun getNewListSize() = newItems.size
// Проверка, являются ли элементы одинаковыми (например, по ID)
override fun areItemsTheSame(oldPos: Int, newPos: Int) =
items[oldPos] == newItems[newPos]
// Проверка, изменилось ли содержимое элемента
override fun areContentsTheSame(oldPos: Int, newPos: Int) =
items[oldPos] == newItems[newPos]
})
items = newItems
diffResult.dispatchUpdatesTo(this) // Применяем изменения к адаптеру
}
// Остальная реализация адаптера (ViewHolder, onCreateViewHolder и т.д.)
}
✅ Эффективность: Обновляет только измененные элементы, а не весь список.
✅ Анимации: Автоматически анимирует изменения (если включено).
✅ Простота: Позволяет избежать ручного управления notifyItemChanged
, notifyItemInserted
и т.д.
⚠ Не подходит для очень больших списков (более 10K элементов), т.к. расчет diff может занять время. В таких случаях лучше обновлять данные порциями.
DiffUtil
— это мощный инструмент для оптимизации обновлений RecyclerView
, который вычисляет различия между списками и применяет только необходимые изменения, улучшая производительность и UX.