Sobes.tech
Junior — Middle

Маъзулоти ва асосҳои кори синфи DiffUtils дар таҳияи Android-ро шарҳ диҳед

sobes.tech AI

Ҷавоб аз AI

Класи DiffUtils дар Android барои ҳисоб кардани фарқият байни ду рӯйхати маълумотҳо самаранок истифода мешавад, масалан, ҳангоми навсозии мундариҷаи RecyclerView. Он имкон медиҳад, ки муайян карда шавад, ки кадом элементҳо илова шудаанд, хориҷ шудаанд ё тағир ёфтаанд, ва танҳо ин қисмҳои интерфейсро навсозӣ мекунад, ки ин ба иҷроиш ва ҳамвории анимацияҳо такя мекунад.

Нақшаи асосӣ ин аст, ки рӯйхати кӯҳна ва навро бо истифода аз усулҳо муқоиса кунем:

  • areItemsTheSame(int oldItemPosition, int newItemPosition) — санҷед, ки оё элементҳо дар ду рӯйхат як объекти якхела мебошанд.
  • areContentsTheSame(int oldItemPosition, int newItemPosition) — санҷед, ки оё мундариҷаи элементҳо якхела аст.

Пас аз ҳисоб кардани фарқият, DiffUtils рӯйхати амалҳои навсозиро мебарорад, ки метавонанд ба адаптер татбиқ шаванд.

Маслиҳат барои истифода:

val diffCallback = object : DiffUtil.Callback() {
    override fun getOldListSize() = oldList.size
    override fun getNewListSize() = newList.size

    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]
    }
}

val diffResult = DiffUtil.calculateDiff(diffCallback)
diffResult.dispatchUpdatesTo(adapter)

Инчунин, DiffUtils кӯмак мекунад, ки навсозии рӯйхатҳо дар барномаҳои Android оптималӣ гардонида шаванд.