1 min readDec 11, 2017
Unfortunately, In MVP I still implement traditional way like this:
Activity {
recyclerView.adapter = adapter
adapter.setItemOnClickListener { position ->
presenter.onItemClick(position)
}
}Presenter {
onItemClick(position:Int) {
val item = list.get(position)
// do something
}
}
If you implement MVVM with Databinding. You can implement it in XML layout
// layout.xml
<RecyclerView
recycler:datas="@{viewModel.datas}"
recycler:onItemClick="@{viewModel.onItemClicked}"
/>// Bindingadapter.kt
@BindingAdapter("datas")
fun adapterDatas(view:RecyclerView, datas:List<Data>) {
view.adapter.updateDatas(datas)
}
@bindingAdapter("onItemClick")
fun adapterOnItemClick(view:RecyclerView, click:(Int, Item) -> Unit) {
view.adapter.itemClick = click
}// ViewModel.kt
ViewModel {
val datas = ObservableField<Data>()
@Bindable
fun getOnItemClick() : (Int, Item) -> Unit) {
return {position, item -> /* do something */}}
}
// Adapter.kt
Adapter {
var itemClick : ((Int, Item) -> Unit)? = null
fun onBindViewHolder(holder, position) {
holder.itemView.setOnItemClick { itemClick?.invoke(position, datas[position])
}
}
I hope it would be helpful