Advertisement
Guest User

Untitled

a guest
Oct 18th, 2019
81
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.28 KB | None | 0 0
  1. package com.mobilemedia.tanuki.ui.base.recycler
  2.  
  3. import android.view.LayoutInflater
  4. import android.view.View
  5. import android.view.ViewGroup
  6. import androidx.recyclerview.widget.DiffUtil
  7. import androidx.recyclerview.widget.RecyclerView
  8.  
  9. abstract class GenericAdapter<T> : RecyclerView.Adapter<RecyclerView.ViewHolder> {
  10.  
  11. private val itemList = mutableListOf<T>()
  12. private var itemClickListener: OnItemClickListener<T>? = null
  13. private var diffUtil: GenericItemDiff<T>? = null
  14.  
  15. constructor()
  16.  
  17. /**
  18. * Use this constructor when you want set Click listener for elements of adapter
  19. */
  20. constructor(listener: OnItemClickListener<T>) {
  21. itemClickListener = listener
  22. }
  23.  
  24. protected abstract fun getLayoutId(position: Int, obj: T): Int
  25.  
  26. /**
  27. * Override method [getViewHolder] if you want to specify multiple View Holders
  28. */
  29. protected open fun getViewHolder(view: View, viewType: Int): RecyclerView.ViewHolder {
  30. return ViewHolderFactory.create(view, viewType)
  31. }
  32.  
  33. override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
  34. return getViewHolder(
  35. LayoutInflater.from(parent.context)
  36. .inflate(viewType, parent, false)
  37. , viewType
  38. )
  39. }
  40.  
  41. override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
  42. @Suppress("UNCHECKED_CAST")
  43. (holder as Binder<T>).bind(itemList[position], itemClickListener)
  44. }
  45.  
  46. override fun getItemCount(): Int = itemList.size
  47.  
  48. override fun getItemViewType(position: Int): Int = getLayoutId(position, itemList[position])
  49.  
  50. fun setDiffUtilCallback(diffUtilImpl: GenericItemDiff<T>) {
  51. diffUtil = diffUtilImpl
  52. }
  53.  
  54. /**
  55. * Adapter [update] based on DiffUtil implementation availability
  56. */
  57. fun update(items: List<T>) {
  58. if (diffUtil != null) {
  59. val result = DiffUtil.calculateDiff(GenericDiffUtil(itemList, items, diffUtil!!))
  60.  
  61. itemList.clear()
  62. itemList.addAll(items)
  63. result.dispatchUpdatesTo(this)
  64. } else {
  65. itemList.clear()
  66. itemList.addAll(items)
  67. notifyDataSetChanged()
  68. }
  69. }
  70.  
  71. internal interface Binder<T> {
  72. fun bind(data: T, listener: OnItemClickListener<T>?)
  73. }
  74. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement