如何在 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()?