Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何在RecyclerView.Adapter中使用ViewBinding?_Android_Android Viewbinding - Fatal编程技术网

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>