Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package com.mobilemedia.tanuki.ui.base.recycler
- import android.view.LayoutInflater
- import android.view.View
- import android.view.ViewGroup
- import androidx.recyclerview.widget.DiffUtil
- import androidx.recyclerview.widget.RecyclerView
- abstract class GenericAdapter<T> : RecyclerView.Adapter<RecyclerView.ViewHolder> {
- private val itemList = mutableListOf<T>()
- private var itemClickListener: OnItemClickListener<T>? = null
- private var diffUtil: GenericItemDiff<T>? = null
- constructor()
- /**
- * Use this constructor when you want set Click listener for elements of adapter
- */
- constructor(listener: OnItemClickListener<T>) {
- itemClickListener = listener
- }
- protected abstract fun getLayoutId(position: Int, obj: T): Int
- /**
- * Override method [getViewHolder] if you want to specify multiple View Holders
- */
- protected open fun getViewHolder(view: View, viewType: Int): RecyclerView.ViewHolder {
- return ViewHolderFactory.create(view, viewType)
- }
- override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
- return getViewHolder(
- LayoutInflater.from(parent.context)
- .inflate(viewType, parent, false)
- , viewType
- )
- }
- override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
- @Suppress("UNCHECKED_CAST")
- (holder as Binder<T>).bind(itemList[position], itemClickListener)
- }
- override fun getItemCount(): Int = itemList.size
- override fun getItemViewType(position: Int): Int = getLayoutId(position, itemList[position])
- fun setDiffUtilCallback(diffUtilImpl: GenericItemDiff<T>) {
- diffUtil = diffUtilImpl
- }
- /**
- * Adapter [update] based on DiffUtil implementation availability
- */
- fun update(items: List<T>) {
- if (diffUtil != null) {
- val result = DiffUtil.calculateDiff(GenericDiffUtil(itemList, items, diffUtil!!))
- itemList.clear()
- itemList.addAll(items)
- result.dispatchUpdatesTo(this)
- } else {
- itemList.clear()
- itemList.addAll(items)
- notifyDataSetChanged()
- }
- }
- internal interface Binder<T> {
- fun bind(data: T, listener: OnItemClickListener<T>?)
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement