Skip to content

Instantly share code, notes, and snippets.

@alwarren
Last active January 31, 2019 22:58
Show Gist options
  • Save alwarren/8521cbbb7e01939c64d20e99e38e7aa4 to your computer and use it in GitHub Desktop.
Save alwarren/8521cbbb7e01939c64d20e99e38e7aa4 to your computer and use it in GitHub Desktop.
Kotlin Generic RecyclerView.Adapter with Listener
abstract class AbstractListRecycler<T> : RecyclerView.Adapter<RecyclerView.ViewHolder>() {
abstract fun layoutId(): Int
var collection: List<T> by Delegates.observable(emptyList()) {
_, _, _ -> notifyDataSetChanged()
}
internal var clickListener: (T) -> Unit = { }
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder =
createViewHolder(parent.inflate(layoutId()))
@Suppress("UNCHECKED_CAST")
override fun onBindViewHolder(viewHolder: RecyclerView.ViewHolder, position: Int) {
(viewHolder as Binder<T>).bind(collection[position], clickListener)
}
override fun getItemCount(): Int {
return collection.size
}
abstract fun createViewHolder(view: View): RecyclerView.ViewHolder
internal interface Binder<T> {
fun bind(data: T, clickListener: (T) -> Unit)
}
private fun ViewGroup.inflate(@LayoutRes layoutRes: Int): View =
LayoutInflater.from(context).inflate(layoutRes, this, false)
}
class MyAdapter : AbstractListRecycler<MyClass>() {
override fun layoutId() = R.layout.item_row
override fun createViewHolder(view: View) = MyViewHolder(view)
class MyViewHolder(itemView: View): RecyclerView.ViewHolder(itemView), Binder<MyClass> {
override fun bind(data: MyClass, clickListener: (MyClass) -> Unit) {
// set itemView values from data here
itemView.setOnClickListener { clickListener(data) }
}
}
}
private fun initializeView() {
// set layout manager here or in the layout xml
myRecyclerView.adapter = myAdapter
missionsAdapter.clickListener = ::onItemClick
}
private fun onItemClick(data: MyClass) {
// do something with data
// like change something or navigate
}
private fun renderData(items: List<MyClass>?) {
myAdapter.data = items.orEmpty()
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment