Last active
January 31, 2019 22:58
-
-
Save alwarren/8521cbbb7e01939c64d20e99e38e7aa4 to your computer and use it in GitHub Desktop.
Kotlin Generic RecyclerView.Adapter with Listener
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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) | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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) } | |
} | |
} | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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