Junior — Middle
Кадом механизм дар DiffUtil кӯмак мекунад, ки танҳо қисмҳои тағйирёфтаи унсури дар рӯйхат навсозӣ шаванд?
sobes.tech AI
Ҷавоб аз AI
Дар дохили DiffUtil, барои навсозии танҳо қисмҳои тағйирёфтаи унсур, усули getChangePayload() истифода мешавад. Ин механизм имкон медиҳад, ки дақиқ муайян карда шавад, кадом майдонҳои объекти тағйир ёфтаанд ва ин маълумотҳоро ба адаптер интиқол диҳем, то танҳо қисмҳои дахлдори View-ро навсозӣ кунад, на тамоми унсур.
Маслиҳат барои истифода:
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
}
}
Дар адаптер, дар методи onBindViewHolder, мумкин аст, ки ин payload-ро коркард ва танҳо майдонҳои тағйирёфаро навсозӣ кард, ки ин иҷроишро беҳтар мекунад ва ҳамоҳангии интерфейсро зиёд мекунад.