android: Create generic adapter and viewholder
Eliminates repeated code associated with every async differ list
This commit is contained in:
		@@ -0,0 +1,33 @@
 | 
			
		||||
// SPDX-FileCopyrightText: 2024 yuzu Emulator Project
 | 
			
		||||
// SPDX-License-Identifier: GPL-2.0-or-later
 | 
			
		||||
 | 
			
		||||
package org.yuzu.yuzu_emu.adapters
 | 
			
		||||
 | 
			
		||||
import android.annotation.SuppressLint
 | 
			
		||||
import androidx.recyclerview.widget.AsyncDifferConfig
 | 
			
		||||
import androidx.recyclerview.widget.DiffUtil
 | 
			
		||||
import androidx.recyclerview.widget.ListAdapter
 | 
			
		||||
import org.yuzu.yuzu_emu.viewholder.AbstractViewHolder
 | 
			
		||||
import androidx.recyclerview.widget.RecyclerView
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Generic adapter that implements an [AsyncDifferConfig] and covers some of the basic boilerplate
 | 
			
		||||
 * code used in every [RecyclerView].
 | 
			
		||||
 * Type assigned to [Model] must inherit from [Object] in order to be compared properly.
 | 
			
		||||
 */
 | 
			
		||||
abstract class AbstractDiffAdapter<Model : Any, Holder : AbstractViewHolder<Model>> :
 | 
			
		||||
    ListAdapter<Model, Holder>(AsyncDifferConfig.Builder(DiffCallback<Model>()).build()) {
 | 
			
		||||
    override fun onBindViewHolder(holder: Holder, position: Int) =
 | 
			
		||||
        holder.bind(currentList[position])
 | 
			
		||||
 | 
			
		||||
    private class DiffCallback<Model> : DiffUtil.ItemCallback<Model>() {
 | 
			
		||||
        override fun areItemsTheSame(oldItem: Model & Any, newItem: Model & Any): Boolean {
 | 
			
		||||
            return oldItem === newItem
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        @SuppressLint("DiffUtilEquals")
 | 
			
		||||
        override fun areContentsTheSame(oldItem: Model & Any, newItem: Model & Any): Boolean {
 | 
			
		||||
            return oldItem == newItem
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,18 @@
 | 
			
		||||
// SPDX-FileCopyrightText: 2024 yuzu Emulator Project
 | 
			
		||||
// SPDX-License-Identifier: GPL-2.0-or-later
 | 
			
		||||
 | 
			
		||||
package org.yuzu.yuzu_emu.viewholder
 | 
			
		||||
 | 
			
		||||
import androidx.recyclerview.widget.RecyclerView
 | 
			
		||||
import androidx.viewbinding.ViewBinding
 | 
			
		||||
import org.yuzu.yuzu_emu.adapters.AbstractDiffAdapter
 | 
			
		||||
import org.yuzu.yuzu_emu.adapters.AbstractListAdapter
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * [RecyclerView.ViewHolder] meant to work together with a [AbstractDiffAdapter] or a
 | 
			
		||||
 * [AbstractListAdapter] so we can run [bind] on each list item without needing a manual hookup.
 | 
			
		||||
 */
 | 
			
		||||
abstract class AbstractViewHolder<Model>(binding: ViewBinding) :
 | 
			
		||||
    RecyclerView.ViewHolder(binding.root) {
 | 
			
		||||
    abstract fun bind(model: Model)
 | 
			
		||||
}
 | 
			
		||||
		Reference in New Issue
	
	Block a user