Junior — Middle
Milline DiffUtili mehhanism aitab uuendada ainult loendis muudetud osi?
sobes.tech AI
Vastus AI-lt
Sisemiselt DiffUtil, et ainult muudetud elemendi osade uuendamiseks kasutatakse meetodit getChangePayload(). See mehhanism võimaldab täpselt määrata, millised objekti väljad on muutunud, ja edastada need andmed adapterile, et uuendada ainult vastavaid View osi, mitte kogu elementi.
Kasutusnäide:
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
}
}
Adapteri onBindViewHolder meetodis saab seda payload-i töödelda ja uuendada ainult muudetud välju, mis parandab jõudlust ja sujuvust kasutajaliideses.