如何在RecyclerView.Adapter中使用ViewBinding? [英] How to use ViewBinding in a RecyclerView.Adapter?
问题描述
我可以使用ViewBindings替换典型的 RecyclerView.Adapter
初始化代码中的 findViewById
吗?我无法在对象中设置 binding
val,因为每个单元格的ViewHolders都不相同.
Can I use ViewBindings to replace findViewById
in this typical RecyclerView.Adapter
initialization code? I can't set a binding
val in the object as the ViewHolders are different per cell.
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)
// ...
}
推荐答案
您需要做的是将生成的绑定类对象传递给holder类的构造函数.在下面的示例中,我为 RecyclerView
项目提供了 row_payment
XML文件,并且生成的类为 RowPaymentBinding
,就像这样
What you need to do is pass the generated binding class object to the holder class constructor. In below example, I have row_payment
XML file for RecyclerView
item and the generated class is RowPaymentBinding
so like this
class PaymentAdapter(private val paymentList: List<PaymentBean>) : RecyclerView.Adapter<PaymentAdapter.PaymentHolder>() {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): PaymentHolder {
val itemBinding = RowPaymentBinding.inflate(LayoutInflater.from(parent.context), parent, false)
return PaymentHolder(itemBinding)
}
override fun onBindViewHolder(holder: PaymentHolder, position: Int) {
val paymentBean: PaymentBean = paymentList[position]
holder.bind(paymentBean)
}
override fun getItemCount(): Int = paymentList.size
class PaymentHolder(private val itemBinding: RowPaymentBinding) : RecyclerView.ViewHolder(itemBinding.root) {
fun bind(paymentBean: PaymentBean) {
itemBinding.tvPaymentInvoiceNumber.text = paymentBean.invoiceNumber
itemBinding.tvPaymentAmount.text = paymentBean.totalAmount
}
}
}
此外,通过访问传递的绑定类对象,确保将根视图传递给Viewholder的父类,例如 RecyclerView.ViewHolder(itemBinding.root)
.
Also, make sure you pass the root view to the parent class of Viewholder like this RecyclerView.ViewHolder(itemBinding.root)
by accessing the passed binding class object.
这篇关于如何在RecyclerView.Adapter中使用ViewBinding?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!