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.PopupMenu
import android.widget.RelativeLayout import android.widget.RelativeLayout
import android.widget.TextView import android.widget.TextView
import androidx.recyclerview.widget.DiffUtil
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import org.moire.ultrasonic.R import org.moire.ultrasonic.R
import org.moire.ultrasonic.data.ActiveServerProvider import org.moire.ultrasonic.data.ActiveServerProvider
import org.moire.ultrasonic.domain.GenericEntry
import org.moire.ultrasonic.domain.MusicFolder import org.moire.ultrasonic.domain.MusicFolder
import org.moire.ultrasonic.view.SelectMusicFolderView import org.moire.ultrasonic.view.SelectMusicFolderView
/* /*
* An abstract Adapter, which can be extended to display a List of <T> in a RecyclerView * 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 onItemClick: (T) -> Unit,
val onContextMenuClick: (MenuItem, T) -> Boolean, val onContextMenuClick: (MenuItem, T) -> Boolean,
private val onMusicFolderUpdate: (String?) -> Unit private val onMusicFolderUpdate: (String?) -> Unit
@ -40,11 +42,14 @@ abstract class GenericRowAdapter<T>(
var selectedFolder: String? = null 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>) { open fun setData(data: List<T>) {
val callback = DiffUtilCallback(itemList, data)
val result = DiffUtil.calculateDiff(callback)
itemList = data itemList = data
notifyDataSetChanged() result.dispatchUpdatesTo(this)
} }
/** /**
@ -133,6 +138,27 @@ abstract class GenericRowAdapter<T>(
var coverArtId: String? = null 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 { companion object {
internal const val TYPE_HEADER = 0 internal const val TYPE_HEADER = 0
internal const val TYPE_ITEM = 1 internal const val TYPE_ITEM = 1