Advertisement
Guest User

Untitled

a guest
Feb 20th, 2019
55
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.84 KB | None | 0 0
  1. ========================================================================
  2. @Target(AnnotationTarget.CLASS)
  3. @Retention(AnnotationRetention.RUNTIME)
  4. annotation class LayoutResourceId(
  5. val value: Int
  6. )
  7. ========================================================================
  8. abstract class BaseViewHolder<T>(view: View) : RecyclerView.ViewHolder(view) {
  9.  
  10. abstract fun bind(item: T, vararg listeners: ((T) -> Unit))
  11.  
  12. }
  13. ========================================================================
  14. class BaseDiffUtilCallback<T>(
  15. private val oldList: List<T>,
  16. private val newList: List<T>)
  17. : DiffUtil.Callback() {
  18.  
  19. override fun getOldListSize(): Int = oldList.size
  20.  
  21. override fun getNewListSize(): Int = newList.size
  22.  
  23. override fun areItemsTheSame(oldItemPosition: Int, newItemPosition: Int):
  24. Boolean = oldList[oldItemPosition] == newList[newItemPosition]
  25.  
  26. override fun areContentsTheSame(oldItemPosition: Int, newItemPosition: Int):
  27. Boolean = oldList[oldItemPosition] == newList[newItemPosition]
  28.  
  29. }
  30. ========================================================================
  31. abstract class BaseAdapter<D, T : BaseViewHolder<D>> : RecyclerView.Adapter<T>() {
  32.  
  33. private var dataList = emptyList<D>()
  34. private var itemClickListener: ((D) -> Unit) = {}
  35.  
  36. fun setClickListener(listener: (D) -> Unit) {
  37. itemClickListener = listener
  38. }
  39.  
  40. fun updateData(dataList: List<D>) {
  41. val diffUtilCallback = BaseDiffUtilCallback(this.dataList, dataList)
  42. val diffUtilResult = DiffUtil.calculateDiff(diffUtilCallback,true)
  43. this.dataList = dataList
  44. diffUtilResult.dispatchUpdatesTo(this)
  45. }
  46.  
  47. override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): T {
  48. val layoutResourceId = javaClass.getAnnotation(LayoutResourceId::class.java)
  49. val view = LayoutInflater.from(parent.context).inflate(layoutResourceId.value, parent, false)
  50. return onViewInflated(view)
  51. }
  52.  
  53. abstract fun onViewInflated(view: View): T
  54.  
  55. override fun onBindViewHolder(viewHolder: T, position: Int) {
  56. viewHolder.bind(dataList[position], itemClickListener)
  57. }
  58.  
  59. override fun getItemCount(): Int = dataList.size
  60.  
  61. }
  62. ========================================================================
  63. //example
  64.  
  65. @LayoutResourceId(R.layout.repo_item)
  66. class RepoAdapter : BaseAdapter<RepoModel, RepoAdapter.RepoViewHolder>() {
  67.  
  68. override fun onViewInflated(view: View): RepoViewHolder = RepoViewHolder(view)
  69.  
  70. inner class RepoViewHolder(view: View) : BaseViewHolder<RepoModel>(view) {
  71.  
  72. override fun bind(item: RepoModel, vararg listeners: (RepoModel) -> Unit) {
  73. itemView.tvListName.text = item.name
  74. if (listeners.isNotEmpty()) {
  75. itemView.setOnClickListener {
  76. listeners[0].invoke(item)
  77. }
  78. }
  79. }
  80. }
  81. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement