Junior — Middle
Jaki mechanizm w DiffUtil pomaga aktualizować tylko zmienione części elementu na liście?
sobes.tech AI
Odpowiedź od AI
Wewnątrz DiffUtil, aby zaktualizować tylko zmienione części elementu, używa się metody getChangePayload(). Ten mechanizm pozwala dokładnie określić, które pola obiektu się zmieniły, i przekazać te dane do adaptera, aby zaktualizować tylko odpowiednie części widoku, a nie cały element.
Przykład użycia:
class MyDiffCallback : DiffUtil.Callback() {
override fun areItemsTheSame(oldItemPosition: Int, newItemPosition: Int): Boolean {
return oldList[oldItemPosition].id == newList[newItemPosition].id
}
override fun areContentsTheSame(oldItemPosition: Int, newItemPosition: Int): Boolean {
return oldList[oldItemPosition] == newList[newItemPosition]
}
override fun getChangePayload(oldItemPosition: Int, newItemPosition: Int): Any? {
val oldItem = oldList[oldItemPosition]
val newItem = newList[newItemPosition]
val diffBundle = Bundle()
if (oldItem.title != newItem.title) {
diffBundle.putString("KEY_TITLE", newItem.title)
}
if (oldItem.description != newItem.description) {
diffBundle.putString("KEY_DESCRIPTION", newItem.description)
}
return if (diffBundle.size() == 0) null else diffBundle
}
}
W adapterze, w metodzie onBindViewHolder, można przetworzyć ten payload i zaktualizować tylko zmienione pola, co poprawia wydajność i płynność interfejsu.