我是Kotlin编程语言的新手。我有一些关于RecyclerView和ViewBinding的问题。我的英语可能不好。对此我很抱歉。但我会尽力解释的。如果你能回答我的问题,我会很高兴的。请阅读问题,看图片
1)。我们将视图提供给LandmarkHolder类的构造函数。但是当我们把这个视图发送给RecyclerView的构造函数时。ViewHolder类,我们让binding.root。
a)据我所知,我需要在Recycler的构造函数中编写RecyclerViewRowBinding的对象(我将其写为binding)。ViewHolder "以同样的方式"然后寄过去。但是为什么我必须写绑定。根而不是"binding"?为什么我不能直接输入"binding"?因为绑定本身已经有了设计。
2)。在制作Layout Inflater时,我们通常使用旧方法(R.layout. ....)访问XML文件并对其进行膨胀,也就是说,将其转换为java代码。这里的结构发生了变化。当然,它再次被转换为java代码,但是有一个混乱的情况,我无法解决:
在recycler_row.xml文件中创建一个名为RecyclerRowBinding的类。
这个类有一个充气方法。我从其网站上阅读。此外,这个类直接引用布局中与其相关的视图的id。现在我脑子里一直在想:我在这里膨胀了什么?因为在旧的用法中(使用finviewbyid),当我们编写通货膨胀方法时,我们在通货膨胀方法中添加了一个源xml文件。(像CardView)但是这个新方法没有它。写入parent后,attachtopparent被写入False。
3)。父节点代表我的RecyclerView?
4)。onBindViewHolder函数中的holder对象属于Landmarkholder类。它使用了这个类的属性。但我看到它可以访问itemView。下面是ItemView如何关联到Landmarkholder类。但我看的是类本身,没有定义与这个itemView相关的东西。这个如何到达itemView?当然,调用itemview的目的是调用context。如果上下文存在于其中,则itemview也派生自另一个类。它是从视图类派生的吗?视图类有这个上下文,对吗?我怎么用holder来调用itemView呢?对象?
5)。这个onCreateViewHolder返回LandmarkHolder(绑定)对象。然后需要在其他地方调用该函数才能使其工作。(当然,通常应该调用它)但是它是从哪里调用的呢?在模拟器本身上?
RecyclerViewAdapterRecycler_row.xmlMainActivity.xml
为什么绑定本身不是一个视图?
我没有理解你所有的问题,但也许这个概述会有所帮助。
ViewBinding接受每个XML布局,并为它们创建一个绑定类,该类由与每个具有ID的视图匹配的属性组成,再加上一个名为root
的属性,该属性保存顶级视图。它还有静态函数bind
和inflate
。如果你有一个这样的布局:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="5dp"
android:orientation="vertical">
<TextView
android:id="@+id/recyclerRowTextView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="5dp"
android:text="Test"
android:textColor="#0820aa"
android:textSize="20sp" />
</LinearLayout>
然后它创建了一个类,它相当于下面这个(在Java中,但我会展示一个Kotlin版本,因为这是你正在学习的):
class RecyclerRowBinding private constructor(
val root: LinearLayout,
val recyclerRowTextView: TextView
) {
companion object {
fun bind(view: View): RecyclerRowBinding {
val root = view as LinearLayout
val recyclerRowTextView = root.findViewById<TextView>(R.id.recyclerRowTextView)
return RecyclerRowBinding(root, recyclerRowTextView)
}
fun inflate(layoutInflater: LayoutInflater): RecyclerRowBinding {
return inflate(layoutInflater, null, false)
}
fun inflate(layoutInflater: LayoutInflater, parent: ViewGroup?, attachToParent: Boolean): RecyclerRowBinding {
val root = layoutInflater.inflate(R.layout.recycler_row, parent, attachToParent)
return bind(root)
}
}
}
我没有完全理解你的问题,但有几件事需要注意:
- 它仍然用LayoutInflater从XML中膨胀视图,就像你在没有视图绑定的情况下那样。 绑定本身不是视图类。它只保存视图的引用。
RecyclerView。ViewHolder抽象类的构造函数需要一个itemView
对象,它是项目布局的根视图,所以必须将binding.root
传递给这个构造函数。绑定本身并不是视图。RecyclerView。ViewHolder也有这个itemView
的属性,所以当你创建自己的有绑定的视图holder时,有两种不同的方式来访问根视图,要么使用holder.binding.root
,要么使用holder.itemView
。但是,binding.root
的类型将是LinearLayout,itemView
的类型将是不太具体的ViewGroup
。
Adapter.onCreateViewHolder()
是由RecyclerView调用的,当它需要另一个视图来显示,并且没有任何先前的视图可以回收。