DylanCaiCoding/ViewBindingKTX

请问BRVAH的多布局中也可以直接用吗

HeJingWei opened this issue · 4 comments

多布局的样式是继承的BaseItemProvider,重写的方法是onCreateViewHolder,
也可以直接这样写吗?
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): BaseViewHolder {
return super.onCreateViewHolder(parent, viewType).withBinding { ItemFooBinding.bind(it) }
}

写法没问题,不过重写两个参数的 onCreateViewHolder 方法不知道有没什么隐患。我看了下 BRVAH 的文档是重写只有一个 ViewGroup 参数的方法,最好按照官方的来。

image

我现在用的3.0以上版本,官方这个可重写的方法是2个参数的,一个参数的方法以及没了,我先试一试可以不可以

我现在用的3.0以上版本,官方这个可重写的方法是2个参数的,一个参数的方法以及没了,我先试一试可以不可以

那应该要判断一下是不是当前的类型:

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): BaseViewHolder {
  return when (viewType) {
    itemViewType -> super.onCreateViewHolder(parent, viewType).withBinding { ItemFooBinding.bind(it) }
    else -> super.onCreateViewHolder(parent, viewType)
  }
}

我参考adapter封装了一个多布局的基类,现在能正常显示

abstract class BaseBindingItemProvider<T, VB : ViewBinding>
(private val inflate: (LayoutInflater, ViewGroup, Boolean) -> VB) : BaseItemProvider<T>() {
override val layoutId: Int
    get() = -1

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): BaseViewHolder {
    return BaseBindingHolder(inflate(LayoutInflater.from(parent.context), parent, false))
}

class BaseBindingHolder(private val binding: ViewBinding) : BaseViewHolder(binding.root) {
    constructor(itemView: View) : this(ViewBinding { itemView })

    @Suppress("UNCHECKED_CAST")
    fun <VB : ViewBinding> getViewBinding() = binding as VB
}

override fun convert(helper: BaseViewHolder, item: T) {
    convert(helper as BaseBindingHolder,item)
}

abstract fun convert(helper: BaseBindingHolder, item: T)

}