Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ========================================================================
- @Target(AnnotationTarget.CLASS)
- @Retention(AnnotationRetention.RUNTIME)
- annotation class LayoutResourceId(
- val value: Int
- )
- ========================================================================
- abstract class BaseViewHolder<T>(view: View) : RecyclerView.ViewHolder(view) {
- abstract fun bind(item: T, vararg listeners: ((T) -> Unit))
- }
- ========================================================================
- class BaseDiffUtilCallback<T>(
- private val oldList: List<T>,
- private val newList: List<T>)
- : DiffUtil.Callback() {
- override fun getOldListSize(): Int = oldList.size
- override fun getNewListSize(): Int = newList.size
- override fun areItemsTheSame(oldItemPosition: Int, newItemPosition: Int):
- Boolean = oldList[oldItemPosition] == newList[newItemPosition]
- override fun areContentsTheSame(oldItemPosition: Int, newItemPosition: Int):
- Boolean = oldList[oldItemPosition] == newList[newItemPosition]
- }
- ========================================================================
- abstract class BaseAdapter<D, T : BaseViewHolder<D>> : RecyclerView.Adapter<T>() {
- private var dataList = emptyList<D>()
- private var itemClickListener: ((D) -> Unit) = {}
- fun setClickListener(listener: (D) -> Unit) {
- itemClickListener = listener
- }
- fun updateData(dataList: List<D>) {
- val diffUtilCallback = BaseDiffUtilCallback(this.dataList, dataList)
- val diffUtilResult = DiffUtil.calculateDiff(diffUtilCallback,true)
- this.dataList = dataList
- diffUtilResult.dispatchUpdatesTo(this)
- }
- override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): T {
- val layoutResourceId = javaClass.getAnnotation(LayoutResourceId::class.java)
- val view = LayoutInflater.from(parent.context).inflate(layoutResourceId.value, parent, false)
- return onViewInflated(view)
- }
- abstract fun onViewInflated(view: View): T
- override fun onBindViewHolder(viewHolder: T, position: Int) {
- viewHolder.bind(dataList[position], itemClickListener)
- }
- override fun getItemCount(): Int = dataList.size
- }
- ========================================================================
- //example
- @LayoutResourceId(R.layout.repo_item)
- class RepoAdapter : BaseAdapter<RepoModel, RepoAdapter.RepoViewHolder>() {
- override fun onViewInflated(view: View): RepoViewHolder = RepoViewHolder(view)
- inner class RepoViewHolder(view: View) : BaseViewHolder<RepoModel>(view) {
- override fun bind(item: RepoModel, vararg listeners: (RepoModel) -> Unit) {
- itemView.tvListName.text = item.name
- if (listeners.isNotEmpty()) {
- itemView.setOnClickListener {
- listeners[0].invoke(item)
- }
- }
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement