适用于CymChad/BaseRecyclerViewAdapterHelper
//build.gradle 中增加ViewBinding支持
android {
...
buildFeatures {
viewBinding true
}
}
import android.util.SparseArray
import android.view.LayoutInflater
import android.view.ViewGroup
import androidx.viewbinding.ViewBinding
import com.chad.library.adapter.base.BaseMultiItemQuickAdapter
import com.chad.library.adapter.base.BaseQuickAdapter
import com.chad.library.adapter.base.entity.MultiItemEntity
import com.chad.library.adapter.base.viewholder.BaseViewHolder
class VBBaseViewHolder<VB : ViewBinding>(val binding: VB) : BaseViewHolder(binding.root)
/**
* Adapter基类
*/
abstract class VBBaseQuickAdapter<T, VB : ViewBinding>(
private val inflate: (LayoutInflater, ViewGroup, Boolean) -> VB,
layoutResId: Int = 0
) :BaseQuickAdapter<T, VBBaseViewHolder<VB>>(layoutResId) {
override fun onCreateDefViewHolder(parent: ViewGroup, viewType: Int): VBBaseViewHolder<VB> {
val viewBinding = inflate(LayoutInflater.from(parent.context), parent,false)
return VBBaseViewHolder(viewBinding)
}
}
/**
* 多布局Adapter基类
*/
abstract class VBBaseMultiItemQuickAdapter <T : MultiItemEntity>: BaseMultiItemQuickAdapter<T, VBBaseViewHolder<ViewBinding>>() {
private val bindings: SparseArray<(LayoutInflater, ViewGroup, Boolean) -> ViewBinding> by lazy(LazyThreadSafetyMode.NONE) {
SparseArray<(LayoutInflater, ViewGroup, Boolean) -> ViewBinding>()
}
fun addViewBinding(type: Int,inflate: (LayoutInflater, ViewGroup, Boolean) -> ViewBinding){
bindings.put(type, inflate)
}
override fun onCreateDefViewHolder(parent: ViewGroup, viewType: Int): VBBaseViewHolder<ViewBinding> {
val inflate = bindings.get(viewType)
require(inflate != null) { "ViewType: $viewType found ViewBinding,please use addViewBinding() first!" }
val viewBinding = inflate(LayoutInflater.from(parent.context), parent,false)
return VBBaseViewHolder(viewBinding)
}
}
使用
普通Adapter
class MyAdapter:VBBaseQuickAdapter<String,ABinding>(ABinding::inflate){
override fun convert(holder: VBBaseViewHolder<ABinding>, item: String) {
holder.binding...
}
}
多布局Adapter
class MyAdapter:VBBaseMultiItemQuickAdapter<MultiItemEntity>(){
init {
addViewBinding(0, ABinding::inflate)
addViewBinding(1, BBinding::inflate)
}
override fun convert(holder: VBBaseViewHolder<ViewBinding>, item: MultiItemEntity) {
holder.binding.apply {
if (this is ABinding) {
...
}else if (this is BBinding){
...
}
}
}
}