diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/android/app/src/main/java/org/yuzu/yuzu_emu/adapters/AbstractDiffAdapter.kt | 33 | ||||
| -rw-r--r-- | src/android/app/src/main/java/org/yuzu/yuzu_emu/viewholder/AbstractViewHolder.kt | 18 |
2 files changed, 51 insertions, 0 deletions
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/adapters/AbstractDiffAdapter.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/adapters/AbstractDiffAdapter.kt new file mode 100644 index 000000000..f006f9e3d --- /dev/null +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/adapters/AbstractDiffAdapter.kt | |||
| @@ -0,0 +1,33 @@ | |||
| 1 | // SPDX-FileCopyrightText: 2024 yuzu Emulator Project | ||
| 2 | // SPDX-License-Identifier: GPL-2.0-or-later | ||
| 3 | |||
| 4 | package org.yuzu.yuzu_emu.adapters | ||
| 5 | |||
| 6 | import android.annotation.SuppressLint | ||
| 7 | import androidx.recyclerview.widget.AsyncDifferConfig | ||
| 8 | import androidx.recyclerview.widget.DiffUtil | ||
| 9 | import androidx.recyclerview.widget.ListAdapter | ||
| 10 | import org.yuzu.yuzu_emu.viewholder.AbstractViewHolder | ||
| 11 | import androidx.recyclerview.widget.RecyclerView | ||
| 12 | |||
| 13 | /** | ||
| 14 | * Generic adapter that implements an [AsyncDifferConfig] and covers some of the basic boilerplate | ||
| 15 | * code used in every [RecyclerView]. | ||
| 16 | * Type assigned to [Model] must inherit from [Object] in order to be compared properly. | ||
| 17 | */ | ||
| 18 | abstract class AbstractDiffAdapter<Model : Any, Holder : AbstractViewHolder<Model>> : | ||
| 19 | ListAdapter<Model, Holder>(AsyncDifferConfig.Builder(DiffCallback<Model>()).build()) { | ||
| 20 | override fun onBindViewHolder(holder: Holder, position: Int) = | ||
| 21 | holder.bind(currentList[position]) | ||
| 22 | |||
| 23 | private class DiffCallback<Model> : DiffUtil.ItemCallback<Model>() { | ||
| 24 | override fun areItemsTheSame(oldItem: Model & Any, newItem: Model & Any): Boolean { | ||
| 25 | return oldItem === newItem | ||
| 26 | } | ||
| 27 | |||
| 28 | @SuppressLint("DiffUtilEquals") | ||
| 29 | override fun areContentsTheSame(oldItem: Model & Any, newItem: Model & Any): Boolean { | ||
| 30 | return oldItem == newItem | ||
| 31 | } | ||
| 32 | } | ||
| 33 | } | ||
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/viewholder/AbstractViewHolder.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/viewholder/AbstractViewHolder.kt new file mode 100644 index 000000000..7101ad434 --- /dev/null +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/viewholder/AbstractViewHolder.kt | |||
| @@ -0,0 +1,18 @@ | |||
| 1 | // SPDX-FileCopyrightText: 2024 yuzu Emulator Project | ||
| 2 | // SPDX-License-Identifier: GPL-2.0-or-later | ||
| 3 | |||
| 4 | package org.yuzu.yuzu_emu.viewholder | ||
| 5 | |||
| 6 | import androidx.recyclerview.widget.RecyclerView | ||
| 7 | import androidx.viewbinding.ViewBinding | ||
| 8 | import org.yuzu.yuzu_emu.adapters.AbstractDiffAdapter | ||
| 9 | import org.yuzu.yuzu_emu.adapters.AbstractListAdapter | ||
| 10 | |||
| 11 | /** | ||
| 12 | * [RecyclerView.ViewHolder] meant to work together with a [AbstractDiffAdapter] or a | ||
| 13 | * [AbstractListAdapter] so we can run [bind] on each list item without needing a manual hookup. | ||
| 14 | */ | ||
| 15 | abstract class AbstractViewHolder<Model>(binding: ViewBinding) : | ||
| 16 | RecyclerView.ViewHolder(binding.root) { | ||
| 17 | abstract fun bind(model: Model) | ||
| 18 | } | ||