Как правильно разделить универсальный reyclerview на основной модуль - PullRequest
0 голосов
/ 06 октября 2019

Я пытаюсь создать приложение 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)
...