Android 如何在RecyclerView.Adapter中使用ViewBinding?
在这个典型的Android 如何在RecyclerView.Adapter中使用ViewBinding?,android,android-viewbinding,Android,Android Viewbinding,在这个典型的RecyclerView.Adapter初始化代码中,我可以使用ViewBindings替换findViewById?我无法在对象中设置绑定val,因为每个单元格的视图持有者不同 class CardListAdapter(private val cards: LiveData<List<Card>>) : RecyclerView.Adapter<CardListAdapter.CardViewHolder>() { class Car
RecyclerView.Adapter
初始化代码中,我可以使用ViewBindings替换findViewById
?我无法在对象中设置绑定
val,因为每个单元格的视图持有者不同
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)
// ...
}
class CardListAdapter(私有val卡:LiveData):RecyclerView.Adapter(){
类别CardViewHolder(val cardView:View):RecyclerView.ViewHolder(cardView)
重写CreateViewHolder(父级:ViewGroup,viewType:Int):CardViewHolder{
val binding=CardBinding.inflate(LayoutInflater.from(parent.context),parent,false)
返回CardViewHolder(binding.root)
}
覆盖BindViewHolder(支架:CardViewHolder,位置:Int){
val title=holder.cardView.findViewById(R.id.title)
val description=holder.cardView.findViewById(R.id.description)
val值=holder.cardView.findViewById(R.id.value)
// ...
}
将绑定
连接到视图支架,而不是视图
class CardViewHolder(val binding: CardBinding) : RecyclerView.ViewHolder(binding.root)
如果传递绑定,则绑定将传递到binding.root
到RecyclerView.ViewHolder(binding.root)
然后使用以下工具访问任意位置:
holder.binding.title
只需将您的模型CALS传递到xml中,并将这些数据设置为xml。这段代码看起来很好,并添加了一个方法,在该方法中,您可以将这些数据添加到绑定中,就像您不需要为此修改id一样
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
holder.setData(listData[position])
}
fun setData(model: ListData) {
with(binding) {
data = model
executePendingBindings()
}
}
您可以像这样使用数据绑定
class CardListAdapter(
private val mActivity: FragmentActivity?
) :
RecyclerView.Adapter<RecyclerView.ViewHolder>() {
private var mCustomLayoutBinding: CustomLayoutBinding? = null
inner class MyViewHolder(val mBinding: CustomLayoutBinding) :
RecyclerView.ViewHolder(mBinding.getRoot())
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
if (layoutInflater == null)
layoutInflater = LayoutInflater.from(parent.context)
var viewHolder: RecyclerView.ViewHolder? = null
val inflater = LayoutInflater.from(parent.context)
viewHolder = getViewHolder(parent, inflater)
return viewHolder!!
}
private fun getViewHolder(
parent: ViewGroup,
inflater: LayoutInflater
): RecyclerView.ViewHolder {
mCustomLayoutBinding =
DataBindingUtil.inflate(inflater, R.layout.custom_layout, parent, false)
return MyViewHolder(this!!.mAssistanceLogCustomLayoutBinding!!)
}
override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
val taskModal = mArrayList.get(position)
holder.mBinding.txtTitle.setText(taskModal.title)
}
override fun getItemCount(): Int {
return assistanceArrayList.size
}
override fun getItemId(position: Int): Long {
return position.toLong()
}
override fun getItemViewType(position: Int): Int {
return position
}
}
类CardListAdapter(
私人活动:碎片活动?
) :
RecyclerView.Adapter(){
私有变量mCustomLayoutBinding:CustomLayoutBinding?=null
内部类MyViewHolder(val mBinding:CustomLayoutBinding):
RecyclerView.ViewHolder(mBinding.getRoot())
override fun onCreateViewHolder(父级:ViewGroup,viewType:Int):RecyclerView.ViewHolder{
if(layoutInflater==null)
layoutInflater=layoutInflater.from(parent.context)
var viewHolder:RecyclerView.viewHolder?=null
val inflater=LayoutInflater.from(parent.context)
viewHolder=getViewHolder(父级、充气机)
返回视图持有者!!
}
私人娱乐getViewHolder(
父对象:视图组,
充气机
):RecyclerView.ViewHolder{
mCustomLayoutBinding=
数据绑定器充气(充气器,右布局,自定义布局,父级,假)
返回MyViewHolder(this!!.mAssistanceLogCustomLayoutBinding!!)
}
覆盖onBindViewHolder(holder:RecyclerView.ViewHolder,位置:Int){
val taskModal=mArrayList.get(位置)
holder.mBinding.txtTitle.setText(taskmodel.title)
}
重写getItemCount():Int{
返回助手arraylist.size
}
覆盖getItemId(位置:Int):长{
返回位置。toLong()
}
覆盖getItemViewType(位置:Int):Int{
返回位置
}
}
您需要做的是将生成的binding类对象传递给holder类构造函数。在下面的示例中,我有行付款
XML文件,用于回收视图
项,生成的类是行付款绑定
,如下所示
class PaymentAdapter(private val paymentList:List):RecyclerView.Adapter(){
override fun onCreateViewHolder(父级:ViewGroup,viewType:Int):PaymentHolder{
val itemBinding=RowPaymentBinding.inflate(LayoutFlater.from(parent.context),parent,false)
退货付款持有人(项目绑定)
}
覆盖onBindViewHolder(持有人:PaymentHolder,职位:Int){
val paymentBean:paymentBean=paymentList[职位]
持有者绑定(paymentBean)
}
重写fun getItemCount():Int=paymentList.size
类PaymentHolder(私有val itemBinding:RowPaymentBinding):RecyclerView.ViewHolder(itemBinding.root){
趣味绑定(paymentBean:paymentBean){
itemBinding.tvPaymentInvoiceNumber.text=paymentBean.invoiceNumber
itemBinding.tvPaymentAmount.text=paymentBean.totalAmount
}
}
}
另外,通过访问传递的绑定类对象,确保将根视图传递给Viewholder的父类,如下所示
RecyclerView.Viewholder(itemBinding.root)
。您可以使用如下视图绑定:
package com.example.kotlinprogramming.adapter
import android.content.Context
import android.view.LayoutInflater
import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView
import com.example.kotlinprogramming.data.HobbiesData
import com.example.kotlinprogramming.databinding.ItemHobbieBinding
class HobbiesAdapter(var context: Context, var hobbiesList: List<HobbiesData>) :
RecyclerView.Adapter<HobbiesAdapter.HobbiesViewHolder>() {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): HobbiesViewHolder {
val view = ItemHobbieBinding.inflate(LayoutInflater.from(context) , parent,false)
return HobbiesViewHolder(view)
}
override fun onBindViewHolder(holder: HobbiesViewHolder, position: Int) {
val hobbie = hobbiesList.get(position)
holder.viewBinding.tvHobbie.text = hobbie.title
}
inner class HobbiesViewHolder(var viewBinding: ItemHobbieBinding) : RecyclerView.ViewHolder(viewBinding.root) {
}
override fun getItemCount(): Int {
return hobbiesList.size
}
}
package com.example.kotlinprogramming.adapter
导入android.content.Context
导入android.view.LayoutInflater
导入android.view.ViewGroup
导入androidx.recyclerview.widget.recyclerview
导入com.example.kotlinprogramming.data.HobbiesData
导入com.example.kotlinprogramming.databinding.ItemHobbieBinding
类HobbiesAdapter(变量上下文:上下文,变量hobbiesList:List):
RecyclerView.Adapter(){
override fun onCreateViewHolder(父级:ViewGroup,viewType:Int):HobbiesViewHolder{
val view=ItemHobbieBinding.inflate(LayoutFlater.from(上下文),父级,false)
返回HobbiesViewHolder(视图)
}
覆盖BindViewHolder(holder:HobbiesViewHolder,位置:Int){
val hobbie=hobbiesList.get(位置)
holder.viewBinding.tvHobbie.text=hobbie.title
}
内部类HobbiesViewHolder(var viewBinding:ItemHobbieBinding):RecyclerView.ViewHolder(viewBinding.root){
}
重写getItemCount():Int{
返回hobbiesList.size
}
}
下面是item_cabiods.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.cardview.widget.CardView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_margin="12dp"
android:layout_height="wrap_content"
>
<TextView
android:id="@+id/tvHobbie"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="8dp"
android:gravity="center"
android:textSize="30sp"
tools:text="Hobbie1"
/>
</androidx.cardview.widget.CardView>
我写了一个简单且可重用的:
class ViewBindingVH私有构造函数(val binding:ViewBinding):
RecyclerView.ViewHolder(binding.root){
伴星{
在线娱乐(
父对象:视图组,
交叉内联块:(充气器:布局充气器,容器:视图组,附加:布尔)->ViewBinding
)=ViewBindingVH(块(布局)
<?xml version="1.0" encoding="utf-8"?>
<androidx.cardview.widget.CardView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_margin="12dp"
android:layout_height="wrap_content"
>
<TextView
android:id="@+id/tvHobbie"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="8dp"
android:gravity="center"
android:textSize="30sp"
tools:text="Hobbie1"
/>
</androidx.cardview.widget.CardView>