Skip to content

Instantly share code, notes, and snippets.

@addeeandra
Last active June 7, 2021 05:43
Show Gist options
  • Save addeeandra/15f894c6bb028ba1568317cd6938aac2 to your computer and use it in GitHub Desktop.
Save addeeandra/15f894c6bb028ba1568317cd6938aac2 to your computer and use it in GitHub Desktop.
Simple (Paged) RecyclerViewAdapter
abstract class AppPagedRecyclerViewAdapter<BIND : ViewDataBinding, M : Any>(
diffUtil: DiffUtil.ItemCallback<M>
) : PagedListAdapter<M, AppPagedRecyclerViewAdapter.ViewHolder<BIND>>(diffUtil) {
abstract fun onCreateViewBindingHolder(inflater: LayoutInflater, parent: ViewGroup): BIND
abstract fun onPrepareBindViewHolder(binding: BIND, model: M)
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder<BIND> {
val inflater = LayoutInflater.from(parent.context)
return ViewHolder(onCreateViewBindingHolder(inflater, parent))
}
override fun onBindViewHolder(holder: ViewHolder<BIND>, position: Int) {
val item = getItem(position)
onPrepareBindViewHolder(holder.binding, item)
holder.binding.executePendingBindings()
}
class ViewHolder<BIND : ViewDataBinding> constructor(val binding: BIND) :
RecyclerView.ViewHolder(binding.root)
}
abstract class AppRecyclerViewAdapter<BIND : ViewDataBinding, M : Any>(
diffUtil: DiffUtil.ItemCallback<M>
) : ListAdapter<M, AppRecyclerViewAdapter.ViewHolder<BIND>>(diffUtil) {
abstract fun onCreateViewBindingHolder(inflater: LayoutInflater, parent: ViewGroup): BIND
abstract fun onPrepareBindViewHolder(binding: BIND, model: M)
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder<BIND> {
val inflater = LayoutInflater.from(parent.context)
return ViewHolder(onCreateViewBindingHolder(inflater, parent))
}
override fun onBindViewHolder(holder: ViewHolder<BIND>, position: Int) {
val item = getItem(position)
onPrepareBindViewHolder(holder.binding, item)
holder.binding.executePendingBindings()
}
class ViewHolder<BIND : ViewDataBinding> constructor(val binding: BIND) :
RecyclerView.ViewHolder(binding.root)
}
@BindingAdapter("items")
fun <T> RecyclerView.items(items: List<T>?) {
if (adapter != null && adapter is ListAdapter<*, RecyclerView.ViewHolder>) {
(adapter as ListAdapter<T, RecyclerView.ViewHolder>).submitList(items)
}
}
@BindingAdapter("pagedItems")
fun <T> RecyclerView.pagedItems(items: PagedList<T>?) {
if (adapter != null && adapter is PagedListAdapter<*, RecyclerView.ViewHolder>) {
(adapter as PagedListAdapter<T, RecyclerView.ViewHolder>).submitList(items)
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment