首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Kotlin、RecyclerView、ViewBinding

Kotlin、RecyclerView、ViewBinding
EN

Stack Overflow用户
提问于 2021-10-09 06:25:35
回答 1查看 92关注 0票数 0

我是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 )对象。然后需要在其他地方调用此函数才能正常工作。(当然,通常应该调用它)但是它是从哪里调用的呢?仿真器本身?

RecyclerViewAdapterRecycler_row.xmlMainActivity.xml

Why isn't the binding itself a view?

EN

回答 1

Stack Overflow用户

发布于 2021-10-09 13:27:25

我不理解你所有的问题,但也许这篇概述会有所帮助。

ViewBinding获取每个布局并为它们创建一个绑定类,该类由与每个具有ID的视图匹配的属性组成,外加一个名为root的属性来保存顶级视图。它还具有称为bindinflate的静态函数。所以如果你有一个这样的布局:

代码语言:javascript
复制
<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版本,因为这是您正在学习的内容):

代码语言:javascript
复制
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来膨胀你的视图,就像你在没有视图绑定的情况下那样。
  • 绑定本身并不是一个视图类。它只包含对视图的引用。

RecyclerView.ViewHolder抽象类的构造函数需要一个itemView对象,该对象是项布局的根视图,因此必须将binding.root传递给此构造函数。绑定本身不是视图。对于这个itemView,RecyclerView.ViewHolder也有一个属性,所以当您创建自己的具有绑定的视图持有者时,有两种不同的方法可以访问根视图,可以使用holder.binding.rootholder.itemView。但是,binding.root将是LinearLayout类型,而itemView将是不太具体的ViewGroup

当RecyclerView需要显示另一个视图,并且没有任何以前可以回收的视图时,它会调用Adapter.onCreateViewHolder()

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69504257

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档