Junior — Middle
Melyik mechanizmus segít a DiffUtil-ben csak a módosított részek frissítésében a listában?
sobes.tech MI
Válasz az MI-től
A DiffUtil belsejében, hogy csak a módosított elemek részeit frissítsük, a getChangePayload() módszert használjuk. Ez a mechanizmus lehetővé teszi, hogy pontosan meghatározzuk, melyik objektum mezők változtak, és ezeket az adatokat átadjuk az adapternek, hogy csak a megfelelő View részeket frissítse, nem az egész elemet.
Használati példa:
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
}
}
Az adapterben a onBindViewHolder metódusban feldolgozhatja ezt a payload-t, és csak a módosított mezőket frissítheti, ami javítja a teljesítményt és a felhasználói felület folyékonyságát.