Ответ
getChangePayload в DiffUtil позволяет оптимизировать обновления RecyclerView, возвращая только изменённые данные вместо полного пересоздания ViewHolder.
Когда areItemsTheSame возвращает true, но areContentsTheSame — false, DiffUtil вызывает getChangePayload. Вместо notifyItemChanged(position), можно использовать notifyItemChanged(position, payload) и обработать частичное обновление в onBindViewHolder.
Пример:
override fun getChangePayload(oldItem: Item, newItem: Item): Any? {
val diff = Bundle()
if (oldItem.text != newItem.text) {
diff.putString("text", newItem.text)
}
return if (diff.isEmpty) null else diff
}
// В адаптере:
override fun onBindViewHolder(holder: ViewHolder, position: Int, payloads: List<Any>) {
if (payloads.isNotEmpty()) {
val bundle = payloads[0] as Bundle
bundle.getString("text")?.let { holder.textView.text = it }
} else {
super.onBindViewHolder(holder, position, payloads)
}
}
Это уменьшает количество вызовов onBindViewHolder и улучшает производительность.