RecyclerView dengan DiffUtil (Android)
DiffUtil untuk apa?
RecyclerView biasa digunakan untuk tampilan list di dalam aplikasi Android. RecyclerView dengan view holdernya telah melakukan optimasi pada tampilan berbentuk list yang sebelumnya menggunakan ListView. Disini saya ingin melakukan optimasi lagi untuk pemakaian RecyclerView, melihat beberapa hari yang lalu saya menemukan bahwa android telah merilis suatu library baru yang bisa melakukan pengecekan perbedaan data pada list. Sehingga saat ingin melakukan update data, RecyclerView hanya akan melakukan melakukan update data pada bagian data yang berbeda. Hal ini bisa kita pakai untuk mengoptimasi recyclerview.
DiffUtil untuk RecyclerView agar lebih optimal dalam melakukan update data.
Berikut tentang DiffUtil
DiffUtil android api level berapa? tidak perlu pusing untuk api level berapanya, karena DiffUtil sudah ada di dalam android support V7 terbaru.
DiffUtil mempunyai callback yang didalamnya terdapat beberapa fungsi yang mengembalikan boolean, dimana callback inilah yang akan dipakai DiffUtil untuk melakukan pengecekan. Berikut beberapa method/fungsi dari callbacknya :
- getOldListSize()-> Mengembalikan ukuran list yang lama.
- getNewListSize()-> Mengembalikan ukuran list yang baru.
- areItemsTheSame(int oldItemPosition, int newItemPosition)-> Dipanggil oleh DiffUtil untuk memutuskan apakah dua object memiliki sama Item. Jika item Anda memiliki id yang unik, fungsi ini harus mengecek apakah id mereka sama.
- areContentsTheSame(int oldItemPosition, int newItemPosition)-> Mengecek apakah dua item memiliki data yang sama. Dimana biasanya pengecekan ini tergantung pada content UI Anda. Fungsi ini dipanggil oleh DiffUtil hanya jika areItemsTheSame mengembalikan true.
- getChangePayload (int oldItemPosition, int newItemPosition)-> Jika areItemTheSame mengembalikan true dan areContentsTheSame mengembalikan false DiffUtil memanggil fungsi ini untuk mendapatkan Object tentang perubahan.
Contoh Kasus
Disini saya akan membuat aplikasi daftar dari sebuah mobil, dimana terdapat nama, rate, dan tahun pembuatan. Saya membuatnya menggunakan kotlin.
Implementasi Callback:
interface DiffUtilAdapterCallback {
fun RecyclerView.Adapter<*>.notifyDiffUtil(old: List, new: List,
compareItem: (Car, Car) -> Boolean, compareContents: (Car, Car) -> Boolean) {
val diff = DiffUtil.calculateDiff(object : Callback() {
override fun areItemsTheSame(oldItemPosition: Int, newItemPosition: Int) =
compareItem(old[oldItemPosition], new[newItemPosition])
override fun areContentsTheSame(oldItemPosition: Int, newItemPosition: Int) =
compareContents(old[oldItemPosition], new[newItemPosition])
override fun getOldListSize() = old.size
override fun getNewListSize() = new.size
})
diff.dispatchUpdatesTo(this)
}
}