上篇提到 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
