具有自定义项目配置的RecyclerView数据绑定

时间:2018-07-23 21:51:06

标签: android android-recyclerview kotlin android-databinding

我的回收者视图有两种类型的项目视图。其中一种类型包含MPAndroidChart。我需要进行一些图表视图配置,而这些配置无法在XML中完成。假设我正在将RecyclerView数据绑定与单个基本视图持有者(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
}

1 个答案:

答案 0 :(得分:1)

您仍然可以访问

holder.itemView.myChartViewId.doSomeStuff()

onBindViewHolder()通话中。

您还可以像下面这样实现在视图持有人中“初始化”图表的功能:

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()
    }
}

并在需要时调用它。