Skip to content

Instantly share code, notes, and snippets.

@ravisorathiya
Created August 3, 2023 04:21
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ravisorathiya/9457edb4a8a3fd2e4ad83721601cce31 to your computer and use it in GitHub Desktop.
Save ravisorathiya/9457edb4a8a3fd2e4ad83721601cce31 to your computer and use it in GitHub Desktop.
BaseAdapter.kt
class BaseAdapter<T : Any>(
private val layoutResId: Int,
areContentsTheSame: (T, T) -> Boolean,
areItemsTheSame: (T, T) -> Boolean = { old, new -> old == new },
private val onBind: (View, T) -> Unit,
private val onViewCreated: (View, position: () -> Pair<Int, T>) -> Unit,
) : ListAdapter<T, RecyclerView.ViewHolder>(
GenericDiffCallback(
areContentsTheSame,
areItemsTheSame,
)
) {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
val itemView = LayoutInflater.from(parent.context).inflate(layoutResId, parent, false)
return ViewHolder(itemView)
}
override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
val item = getItem(position)
onBind(holder.itemView, item)
}
inner class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
init {
try {
onViewCreated(itemView, ::item)
} catch (e: Exception) {
Timber.e(e.stackTraceToString())
}
}
fun item(): Pair<Int, T> {
val absoluteAdapterPosition = absoluteAdapterPosition
return Pair(absoluteAdapterPosition, getItem(absoluteAdapterPosition))
}
}
private class GenericDiffCallback<T : Any>(
private val areContentsSame: (T, T) -> Boolean,
private val areItemsSame: (T, T) -> Boolean,
) : DiffUtil.ItemCallback<T>() {
override fun areContentsTheSame(oldItem: T, newItem: T): Boolean {
return areContentsSame(oldItem, newItem)
}
override fun areItemsTheSame(oldItem: T, newItem: T): Boolean {
return areItemsSame(oldItem, newItem)
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment