在 BaseRecyclerViewAdapterHelper 中使用 ViewBinding

1,880 阅读1分钟

适用于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){
                ...
            }
        }
    }
}