edwardwongtl
01/16/2019, 6:04 AMclass SimpleViewHolder<T>(view: View) : RecyclerView.ViewHolder(view)
class RxAdapter<T>(
@LayoutRes private val layoutId: Int,
private val binding: (View, T) -> Unit
) : ListAdapter<T, SimpleViewHolder<T>>(DiffCallback<T>()) {
private val signal by lazy { PublishSubject.create<Pair<Int, T>>() }
val itemClicks by lazy { signal as Observable<Pair<Int, T>> }
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): SimpleViewHolder<T> =
SimpleViewHolder(parent.inflate(layoutId, false))
override fun onBindViewHolder(holder: SimpleViewHolder<T>, position: Int) {
binding(holder.itemView, getItem(position))
holder.itemView.setOnClickListener { signal.onNext(holder.adapterPosition to getItem(holder.adapterPosition)) }
}
private class DiffCallback<T> : DiffUtil.ItemCallback<T>() {
override fun areItemsTheSame(oldItem: T, newItem: T): Boolean = oldItem == newItem
override fun areContentsTheSame(oldItem: T, newItem: T): Boolean = oldItem == newItem
}
}
Forgive me for combining Rx into it, as it suits my need.arekolek
01/16/2019, 8:46 AMDiffCallback
doesn’t handle modifying an itemedwardwongtl
01/16/2019, 8:47 AMarekolek
01/16/2019, 8:48 AMDiffCallback
doesn’t handle it, think of what happens if an item changes one field