RecyclerView 数据绑定与自定义项配置

RecyclerView data binding with custom item configuration

我的回收站视图有两种类型的项目视图。其中一种有 MPAndroidChart in it. I need to do some chart view configuration that cannot be done in XML. How can I do it given that I am using RecyclerView data binding with a single base view holder (as recommended by George Mount) ?

open class BaseViewHolder(private val binding: ViewDataBinding) : RecyclerView.ViewHolder(binding.root) {
    fun bind(obj: Any) {
        binding.setVariable(BR.obj, obj)
        binding.executePendingBindings()
    }
}

abstract class BaseAdapter : RecyclerView.Adapter<BaseViewHolder>() {
    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): BaseViewHolder {
        val layoutInflater = LayoutInflater.from(parent.context)
        val binding = DataBindingUtil.inflate<ViewDataBinding>(layoutInflater, viewType, parent, false)
        return BaseViewHolder(binding)
    }
    override fun onBindViewHolder(holder: BaseViewHolder, position: Int) {
        val obj = getObjForPosition(position)
        holder.bind(obj)
    }
    override fun getItemViewType(position: Int): Int {
        return getLayoutIdForPosition(position)
    }
    protected abstract fun getObjForPosition(position: Int): Any
    protected abstract fun getLayoutIdForPosition(position: Int): Int
}

您仍然可以访问

holder.itemView.myChartViewId.doSomeStuff()

正在 onBindViewHolder() 通话中。

您还可以像这样在您的视图容器中实现 "initialize" 图表的功能:

open class BaseViewHolder(private val binding: ViewDataBinding) : RecyclerView.ViewHolder(binding.root) {
    fun bind(obj: Any) {
        binding.setVariable(BR.obj, obj)
        binding.executePendingBindings()
    }

    fun initCharts() {
        if (itemView.myChartViewId == null) return
        itemView.myChartViewId.doSomwStuff()
    }
}

并在需要时调用它。