上篇提到 Kotlin Android Extensions 遷移至 Jetpack view binding 的方式,點我進入

 

這篇要說,如何在 RecyclerView Adapter 裡面也可以用 view binding 

剛開始使用 view binding 的朋友們

是不是以為只要在 id 前面加個 binding 就可以解決全部了呢

No, No, No

當遇到 RecyclerView 的時候有想過要怎麼做嗎

把 binding 塞進 Adapter ?

還是在 Adapter 中再來一個 binding ?

 

我的方法如下:

inner class NoLikeYouDataVH(val binding: ItemLikeYouEmptyBinding) :
    RecyclerView.ViewHolder(binding.root)

inner class LikeYouListVH(val binding: ItemLikeYouListBinding) :
    RecyclerView.ViewHolder(binding.root)

依照自己的 viewType 去訂義不同的 ViewHolder

然後讓 ViewHolder 接收 binding

 

之後在 onCreateViewHolder 就和我們平常操作的一樣

利用 viewType 去建立 ViewHolder

但我們怎麼產出 binding 給 ViewHolder 呢?

請用 Binding 的 inflate 就可以了

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
    return when (viewType) {
        typeEmpty -> {
            NoLikeYouDataVH(
                ItemLikeYouEmptyBinding.inflate(
                    LayoutInflater.from(parent.context),
                    parent,
                    false
                )
            )
        }
        else -> {
            LikeYouListVH(
                ItemLikeYouListBinding.inflate(
                    LayoutInflater.from(parent.context),
                    parent,
                    false
                )
            )
        }
    }
}

最後在 onBindViewHolder 時

就可以直接取用 ViewHolder 裡面的 binding 來做 view 的處理囉

像這樣

override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {

    if (holder is NoLikeYouDataVH) {
        holder.binding.itemLikeYouEmptyBtn.setPreventMultiClickListener { clickEvent(it, null) }
    }
}

 

 

End