【发布时间】:2020-02-26 22:30:29
【问题描述】:
我可以在这个典型的RecyclerView.Adapter 初始化代码中使用 ViewBindings 替换 findViewById 吗?我无法在对象中设置binding val,因为每个单元格的 ViewHolders 都不同。
class CardListAdapter(private val cards: LiveData<List<Card>>) : RecyclerView.Adapter<CardListAdapter.CardViewHolder>() {
class CardViewHolder(val cardView: View) : RecyclerView.ViewHolder(cardView)
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): CardViewHolder {
val binding = CardBinding.inflate(LayoutInflater.from(parent.context), parent, false)
return CardViewHolder(binding.root)
}
override fun onBindViewHolder(holder: CardViewHolder, position: Int) {
val title = holder.cardView.findViewById<TextView>(R.id.title)
val description = holder.cardView.findViewById<TextView>(R.id.description)
val value = holder.cardView.findViewById<TextView>(R.id.value)
// ...
}
【问题讨论】:
-
“每个单元格的 ViewHolders 是不同的”——因此每个
ViewHolder都通过其专用的绑定对象进行自己的绑定。将CardBinding传递给CardViewHolder构造函数,使其具有该绑定对象。 IOW,这与使用RecyclerView的数据绑定没有什么不同,而且这种组合已经使用了几年。 -
我发现你也可以使用
CardBinding.bind(holder.cardView)。不知道bind方法的性能是否更差? -
查看我关于视图绑定的博客我解释了关于适配器片段和活动中绑定的反模式和模式,它也深入到了内部????? Androidbites|Viewbinding
-
是的,你可以用看看我的回答
标签: android android-viewbinding