如何在 onBindViewHolder 中添加视图?

Posted

技术标签:

【中文标题】如何在 onBindViewHolder 中添加视图?【英文标题】:how to add views in onBindViewHolder? 【发布时间】:2020-09-01 10:26:51 【问题描述】:

我正在使用 RecyclerView 显示项目列表。 根据具体项目,我想在单元格中显示其他视图。

我知道 viewholder 应该是静态的,但是如何实现依赖于项目属性的单元格设计?

缩小的例子,这给了我奇怪的结果:

class CustomAdapter internal constructor() :
        RecyclerView.Adapter<CustomAdapter.ViewHolder>() 

    private var dataSet = emptyList()

    inner class ViewHolder(v: View) : RecyclerView.ViewHolder(v) 
        val title: TextView
        val linearLayout: LinearLayout

        init 
            title = v.findViewById(R.id.textView)
            linearLayout = v.findViewById(R.id.linearLayout)
        
    

    override fun onCreateViewHolder(viewGroup: ViewGroup, viewType: Int): ViewHolder 
        val v = LayoutInflater.from(viewGroup.context)
                .inflate(R.layout.cardview, viewGroup, false)

        return ViewHolder(v)
    

    override fun onBindViewHolder(viewHolder: ViewHolder, position: Int) 

        viewHolder.title.text = dataSet[position].name
        
        for (i in 0 until 5) 
           viewHolder.linearLayout.addView(ImageView())
        
    


    internal fun setItems(items: List<T>) 
        this.dataSet = items
        notifyDataSetChanged()
    

<androidx.cardview.widget.CardView 
    android:layout_
    android:layout_
    android:gravity="center_vertical">

            <TextView
                android:id="@+id/textView"
                android:layout_
                android:layout_
                android:layout_gravity="center"
                android:layout_marginStart="22dp"
                android:layout_marginEnd="12dp"
                android:text="Title"
                android:textSize="18sp"
                android:textStyle="bold" />

        <LinearLayout
            android:id="@+id/linearLayout"
            android:layout_
            android:layout_
            android:orientation="horizontal">

        </LinearLayout>

</androidx.cardview.widget.CardView>

【问题讨论】:

能否添加viewHolder的布局信息 添加了更多代码 【参考方案1】:

您不能如示例中所示直接添加 ImageView。试试这个:

override fun onBindViewHolder(viewHolder: ViewHolder, position: Int) 
 
 viewHolder.title.text = dataSet[position].name

 for (i in 0 until 5) 
  val holder = viewHolder
  val context = holder.itemView.context
  val imagebyCode = ImageView(context)
  imagebyCode.setImageResource(R.drawable.exampleImage)

  val params : LinearLayout.LayoutParams = LinearLayout.LayoutParams(
  LinearLayout.LayoutParams.MATCH_PARENT,LinearLayout.LayoutParams.WRAP_CONTENT);
  imagebyCode.layoutParams = params
  val myLayout : LinearLayout = holder.itemView.findViewById(R.id.linearLayout)
  myLayout.addView(imagebyCode)
 

【讨论】:

【参考方案2】:

您可以将视图添加到回收站视图行的 xml 并保持可见性隐藏。 在 onBindViewHolder 中,您可以检查条件并使视图可见。

override fun onBindViewHolder(viewHolder: ViewHolder, position: Int) 

    viewHolder.title.text = dataSet[position].name
    
    for (i in 0 until 5) 
       viewHolder.linearLayout.view.visibility = View.VISIBLE //Set visibility here

    

【讨论】:

如果 OP 想要其布局中的动态视图数量,这将不起作用 你的循环实际上并没有做任何事情,它只会将一个视图设置为可见 X 次

以上是关于如何在 onBindViewHolder 中添加视图?的主要内容,如果未能解决你的问题,请参考以下文章

如何在“onBindViewHolder”中获取recyclerview项目的高度

如何在回收站视图的 onBindViewHolder() 方法中调用 getString()?

如何刷新片段中的onBindViewHolder方法

RecyclerView ItemClickListener 在 OnBindViewHolder 中不起作用

如何在相对布局中添加固定标题和滚动视图表行?

在 onBindViewHolder 中为 RecyclerView 设置 Firebase 实时数据库参考中的图像