我是Kotlin编程语言的新手。我有一些关于RecyclerView和ViewBinding的问题。我的英语可能不太好。我对此感到抱歉。但我会尽我最大的努力解释。如果你能回答我的问题,我会很高兴。请阅读问题,看图片
1.)我们将视图提供给LandmarkHolder类的构造函数。但是,当我们将这个视图发送到RecyclerView.ViewHolder类的构造函数时,我们生成了binding.root。
a)据我所知,我需要在Recycler.ViewHolder的构造函数中“以同样的方式”编写RecyclerViewRowBinding的对象(我将其写为binding)并将其发送到那里。但是为什么我要写binding.root而不是“绑定”呢?为什么我不能直接输入"binding“呢?因为绑定本身已经有了设计。
2.)在制作布局扩张器时,我们通常使用旧方法(R.layout。...)并对其进行膨胀,即将其转换为java代码。这里的结构已经改变了。当然,它再次被转换为java代码,但有一个令人困惑的情况,我无法解决:
将创建一个名为RecyclerRowBinding的recycler_row.xml文件类。
这个类有一个inflate方法。我从它的网站上读到的。此外,该类直接引用布局中与其相关的视图的it。现在卡在我脑海里的是这样的:我在膨胀什么?因为在旧的用法中(使用finviewbyid),当我们编写inflate方法时,我们在iflate方法中添加了一个源xml文件(比如CardView),但是这个新方法没有这个文件。在写入父级之后,attachtoParent被写为False。
3.)我们称这个父对象代表我的RecyclerView?
4.)onBindViewHolder函数中的holder对象属于Landmarkholder类。所以它使用这个类的属性。但我发现它可以访问名为itemView的东西。下面是ItemView如何与Landmarkholder类相关联。但是我看的是类本身,没有定义任何与这个itemView相关的东西。这是如何到达itemView的?当然,调用itemview的目的是调用上下文。如果上下文存在于其中,那么itemview也派生自另一个类。它是否派生自View类?View类有这样的上下文,我猜是这样的吗?如何使用“itemView”对象调用此holder?
5.)此绑定返回LandmarkHolder( onCreateViewHolder )对象。然后需要在其他地方调用此函数才能正常工作。(当然,通常应该调用它)但是它是从哪里调用的呢?仿真器本身?
发布于 2021-10-09 13:27:25
我不理解你所有的问题,但也许这篇概述会有所帮助。
ViewBinding获取每个布局并为它们创建一个绑定类,该类由与每个具有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)
}
}
}我没有完全理解你的问题,但有几件事需要注意:
RecyclerView.ViewHolder抽象类的构造函数需要一个itemView对象,该对象是项布局的根视图,因此必须将binding.root传递给此构造函数。绑定本身不是视图。对于这个itemView,RecyclerView.ViewHolder也有一个属性,所以当您创建自己的具有绑定的视图持有者时,有两种不同的方法可以访问根视图,可以使用holder.binding.root或holder.itemView。但是,binding.root将是LinearLayout类型,而itemView将是不太具体的ViewGroup。
当RecyclerView需要显示另一个视图,并且没有任何以前可以回收的视图时,它会调用Adapter.onCreateViewHolder()。
https://stackoverflow.com/questions/69504257
复制相似问题