Я пытаюсь создать приложение modulair android, в котором я хочу поместить код, отвечающий за создание обзора переработчика, в отдельный модуль core_ui, где я могу использовать его повторно и опустить код котла. Однако мне интересно, хорош ли мой подход, в основном с onClickListener, который принимает объект Any и требует приведения его обратно к нужному объекту при использовании внутри Activity. Я думаю, что это не плохой подход, поскольку это просто вопрос преобразованияобъект, однако я чувствую, что это можно сделать лучше или, может быть, я упускаю что-то, что не так с моим подходом. Как правило, я хотел бы знать ваш вклад в этот подход.
Вот код для универсального привязываемого адаптера
open class GenericBindableAdapter<T, R : ViewDataBinding>(var
itemLayoutViewId: Int, var variableId: Int) :
RecyclerView.Adapter<GenericBindableAdapter<T, R>.BindableViewHolder<T>>
(), BindableAdapter<T> {
interface OnItemClickListener {
fun onItemClick(item: Any?)
}
private var onItemClickListener: OnItemClickListener? = null
fun setOnItemClickListener(onItemClickListener: OnItemClickListener) {
this.onItemClickListener = onItemClickListener
}
var dataList: List<T> = emptyList()
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): BindableViewHolder<T> {
val layoutInflater = LayoutInflater.from(parent.context)
val binding: R = DataBindingUtil.inflate(layoutInflater, itemLayoutViewId, parent, false) as R
return BindableViewHolder(binding, variableId)
}
override fun onBindViewHolder(holder: BindableViewHolder<T>, position: Int) {
holder.bind(dataList[position])
}
override fun getItemCount() = dataList.size
override fun setData(data: List<T>?) {
data?.let {
dataList = data
notifyDataSetChanged()
}
}
inner class BindableViewHolder<T>(var binding: ViewDataBinding, var variableId: Int) :
RecyclerView.ViewHolder(binding.root) {
fun bind(item: T) {
binding.apply {
setVariable(variableId, item)
executePendingBindings()
root.setOnClickListener {
onItemClickListener?.onItemClick(item)
}
}
}
}
}
interface BindableAdapter<T> {
fun setData(data: List<T>?)
}
Вот код при создании адаптера
class CommentAdapter : GenericBindableAdapter<Comment,
CommentItemViewBinding>
(R.layout.comment_item_view, BR.comment_item)