Skip to content

Instantly share code, notes, and snippets.

@dmitriy-chernysh
Created June 12, 2020 19:11
Show Gist options
  • Save dmitriy-chernysh/ed8a61bf22eb39de7050841d19616765 to your computer and use it in GitHub Desktop.
Save dmitriy-chernysh/ed8a61bf22eb39de7050841d19616765 to your computer and use it in GitHub Desktop.
RecyclerView + BindingAdapter [Kotlin]
<androidx.recyclerview.widget.RecyclerView
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
bind:eventHandler="@{model.listEventHandler}"
bind:items="@{model.listAddress}" />
class RecyclerViewAdapter : RecyclerView.Adapter<BindingViewHolder>() {
private val items = mutableListOf<RecyclerItem>()
private var eventHandler: RecyclerViewHandler? = null
override fun getItemCount(): Int {
return items.size
}
override fun getItemViewType(position: Int): Int {
return getItem(position).layoutId
}
override fun onCreateViewHolder(
parent: ViewGroup,
viewType: Int
): BindingViewHolder {
val inflater = LayoutInflater.from(parent.context)
val binding: ViewDataBinding = DataBindingUtil.inflate(inflater, viewType, parent, false)
return BindingViewHolder(binding)
}
override fun onBindViewHolder(
holder: BindingViewHolder,
position: Int
) {
getItem(position).bind(holder.binding, eventHandler)
holder.binding.executePendingBindings()
}
fun setEventHandler(handler: RecyclerViewHandler?) {
eventHandler = handler
}
fun updateData(newItems: List<RecyclerItem>) {
this.items.clear()
this.items.addAll(newItems)
notifyDataSetChanged()
}
private fun getItem(position: Int): RecyclerItem {
return items[position]
}
}
class BindingViewHolder(
val binding: ViewDataBinding
) : RecyclerView.ViewHolder(binding.root)
object RecyclerViewExtension {
@BindingAdapter(
value = [
"bind:items",
"bind:eventHandler"
],
requireAll = false
)
@JvmStatic
fun RecyclerView.setItems(
items: List<RecyclerItem>?,
handler: RecyclerViewHandler?
) {
this.itemAnimator = DefaultItemAnimator()
var adapter = (this.adapter as? RecyclerViewAdapter)
if (adapter == null) {
adapter = RecyclerViewAdapter()
this.adapter = adapter
}
adapter.setEventHandler(handler)
adapter.updateData(items.orEmpty())
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment