Skip to content

Instantly share code, notes, and snippets.

@maxost
Created September 5, 2017 02:14
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 maxost/98b4fa2c8053ed8d02554006101b6cca to your computer and use it in GitHub Desktop.
Save maxost/98b4fa2c8053ed8d02554006101b6cca to your computer and use it in GitHub Desktop.
Kotlin: simple RecyclerView adapter in Android
interface MySimpleAdapter<in T> {
fun setNewData(data: List<T>)
}
inline fun <T> simpleAdapter(
itemLayout: Int,
crossinline getId: (T) -> Long,
crossinline bind: (holder: RecyclerView.ViewHolder, item: T) -> Unit,
crossinline onItemClick: (T) -> Unit)
: RecyclerView.Adapter<RecyclerView.ViewHolder>
= object : RecyclerView.Adapter<RecyclerView.ViewHolder>(), MySimpleAdapter<T> {
init { setHasStableIds(true) }
private var data = listOf<T>()
override fun getItemCount(): Int = data.size
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder
= object : RecyclerView.ViewHolder
(LayoutInflater.from(parent.context).inflate(itemLayout, parent, false)) {}
override fun onBindViewHolder(holder: RecyclerView.ViewHolder?, position: Int) {
bind(holder!!, data[position])
holder.itemView.tag = data[position]
holder.itemView.setOnClickListener { onItemClick(it.tag as T) }
}
override fun getItemId(position: Int): Long = getId(data[position])
override fun setNewData(data: List<T>) {
this.data = data
notifyDataSetChanged()
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment