Junior — Middle
Quale meccanismo all'interno di DiffUtil aiuta ad aggiornare solo le parti modificate di un elemento nella lista?
sobes.tech AI
Risposta dell'AI
All’interno di DiffUtil, per aggiornare solo le parti modificate di un elemento, si utilizza il metodo getChangePayload(). Questo meccanismo permette di determinare esattamente quali campi dell’oggetto sono cambiati e di passare questi dati all’adapter per aggiornare solo le parti corrispondenti della View, anziché l’intero elemento.
Esempio di utilizzo:
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
}
}
Nell’adapter, nel metodo onBindViewHolder, è possibile elaborare questa payload e aggiornare solo i campi modificati, migliorando così le prestazioni e la fluidità dell’interfaccia.