android: Only compare game contents for GameAdapter

This commit is contained in:
t895 2024-01-25 08:03:05 -05:00
parent f3749394ac
commit 7b01454d5f
3 changed files with 22 additions and 9 deletions

View File

@ -14,16 +14,21 @@ import androidx.recyclerview.widget.RecyclerView
* Generic adapter that implements an [AsyncDifferConfig] and covers some of the basic boilerplate * Generic adapter that implements an [AsyncDifferConfig] and covers some of the basic boilerplate
* code used in every [RecyclerView]. * code used in every [RecyclerView].
* Type assigned to [Model] must inherit from [Object] in order to be compared properly. * Type assigned to [Model] must inherit from [Object] in order to be compared properly.
* @param exact Decides whether each item will be compared by reference or by their contents
*/ */
abstract class AbstractDiffAdapter<Model : Any, Holder : AbstractViewHolder<Model>> : abstract class AbstractDiffAdapter<Model : Any, Holder : AbstractViewHolder<Model>>(
ListAdapter<Model, Holder>(AsyncDifferConfig.Builder(DiffCallback<Model>()).build()) { exact: Boolean = true
) : ListAdapter<Model, Holder>(AsyncDifferConfig.Builder(DiffCallback<Model>(exact)).build()) {
override fun onBindViewHolder(holder: Holder, position: Int) = override fun onBindViewHolder(holder: Holder, position: Int) =
holder.bind(currentList[position]) holder.bind(currentList[position])
private class DiffCallback<Model> : DiffUtil.ItemCallback<Model>() { private class DiffCallback<Model>(val exact: Boolean) : DiffUtil.ItemCallback<Model>() {
override fun areItemsTheSame(oldItem: Model & Any, newItem: Model & Any): Boolean { override fun areItemsTheSame(oldItem: Model & Any, newItem: Model & Any): Boolean {
if (exact) {
return oldItem === newItem return oldItem === newItem
} }
return oldItem == newItem
}
@SuppressLint("DiffUtilEquals") @SuppressLint("DiffUtilEquals")
override fun areContentsTheSame(oldItem: Model & Any, newItem: Model & Any): Boolean { override fun areContentsTheSame(oldItem: Model & Any, newItem: Model & Any): Boolean {

View File

@ -30,7 +30,7 @@ import org.yuzu.yuzu_emu.utils.GameIconUtils
import org.yuzu.yuzu_emu.viewholder.AbstractViewHolder import org.yuzu.yuzu_emu.viewholder.AbstractViewHolder
class GameAdapter(private val activity: AppCompatActivity) : class GameAdapter(private val activity: AppCompatActivity) :
AbstractDiffAdapter<Game, GameAdapter.GameViewHolder>() { AbstractDiffAdapter<Game, GameAdapter.GameViewHolder>(exact = false) {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): GameViewHolder { override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): GameViewHolder {
CardGameBinding.inflate(LayoutInflater.from(parent.context), parent, false) CardGameBinding.inflate(LayoutInflater.from(parent.context), parent, false)
.also { return GameViewHolder(it) } .also { return GameViewHolder(it) }

View File

@ -70,11 +70,19 @@ class Game(
} }
override fun equals(other: Any?): Boolean { override fun equals(other: Any?): Boolean {
if (other !is Game) { if (this === other) return true
return false if (javaClass != other?.javaClass) return false
}
return hashCode() == other.hashCode() other as Game
if (title != other.title) return false
if (path != other.path) return false
if (programId != other.programId) return false
if (developer != other.developer) return false
if (version != other.version) return false
if (isHomebrew != other.isHomebrew) return false
return true
} }
override fun hashCode(): Int { override fun hashCode(): Int {