Use DiffUtil for better performance when refreshing the data..

This commit is contained in:
tzugen 2021-06-20 00:29:20 +02:00
parent ffe67e6c50
commit 1ecb577c50
No known key found for this signature in database
GPG Key ID: 61E9C34BC10EC930
1 changed files with 29 additions and 3 deletions

View File

@ -16,16 +16,18 @@ import android.widget.ImageView
import android.widget.PopupMenu
import android.widget.RelativeLayout
import android.widget.TextView
import androidx.recyclerview.widget.DiffUtil
import androidx.recyclerview.widget.RecyclerView
import org.moire.ultrasonic.R
import org.moire.ultrasonic.data.ActiveServerProvider
import org.moire.ultrasonic.domain.GenericEntry
import org.moire.ultrasonic.domain.MusicFolder
import org.moire.ultrasonic.view.SelectMusicFolderView
/*
* An abstract Adapter, which can be extended to display a List of <T> in a RecyclerView
*/
abstract class GenericRowAdapter<T>(
abstract class GenericRowAdapter<T : GenericEntry>(
val onItemClick: (T) -> Unit,
val onContextMenuClick: (MenuItem, T) -> Boolean,
private val onMusicFolderUpdate: (String?) -> Unit
@ -40,11 +42,14 @@ abstract class GenericRowAdapter<T>(
var selectedFolder: String? = null
/**
* Sets the data to be displayed in the RecyclerView
* Sets the data to be displayed in the RecyclerView,
* using DiffUtil to efficiently calculate the minimum required changes..
*/
open fun setData(data: List<T>) {
val callback = DiffUtilCallback(itemList, data)
val result = DiffUtil.calculateDiff(callback)
itemList = data
notifyDataSetChanged()
result.dispatchUpdatesTo(this)
}
/**
@ -133,6 +138,27 @@ abstract class GenericRowAdapter<T>(
var coverArtId: String? = null
}
/**
* Calculates the differences between data sets
*/
open class DiffUtilCallback<T : GenericEntry>(
private val oldList: List<T>,
private val newList: List<T>
) : DiffUtil.Callback() {
override fun getOldListSize(): Int {
return oldList.size
}
override fun getNewListSize(): Int {
return 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]
}
}
companion object {
internal const val TYPE_HEADER = 0
internal const val TYPE_ITEM = 1