当前位置: 首页 > 知识库问答 >
问题:

Kotlin,RecycerView,ViewBinding

步兴为
2023-03-14

我是Kotlin编程语言的新手。我有一些关于RecycerView和ViewBinding的问题。我的英语可能不好。对此我很抱歉。但我会尽力解释的。如果你能回答我的问题我会很高兴的。请阅读问题,看图片

1.)我们将视图交给LandmarkHolder类的构造函数,但是当我们将此视图发送给RecycerView.Viewholder类的构造函数时,我们将生成binding.root。

a)据我所知,我需要“以同样的方式”在Recycer.Viewholder的构造函数中编写RecycerViewRowBinding(我将其编写为binding)的对象并将其发送到那里。但是为什么我必须编写binding.root而不是“binding”呢?为什么我不能只键入“binding”呢?因为binding已经有了设计本身。

2.)在制作布局膨胀器时,我们通常使用旧方法(R.Layout)访问XML文件。...)并将其膨胀,即转换为java代码,这里的结构发生了变化,当然再次转换为java代码,但有一个我无法解决的困惑情况:

创建了recycler_row.xml文件的一个类,称为recyclerRowBinding。

该类有一个充气方法。我从它的网站上读到的。此外,该类还直接引用布局中与其相关的视图的ID。现在我脑子里想的是:我在这里充气的是什么?因为在以前的用法中(使用finviewbyid),当我们编写iflate方法时,我们在iflate方法中添加了一个源xml文件。(像CardView一样),但是这个新方法没有它。写入父级后,attachtoParent被写入为false。

3.)我们所称的这个父级代表我的RecycerView?

4.)onBindViewHolder函数中的holder对象属于Landmarkholder类。因此它使用此类的属性。但我看到它可以访问名为ItemView的东西。下面是ItemView如何与Landmarkholder类相关联。但是我看的是类本身,没有定义任何与这个itemView相关的内容。这是如何到达ItemView的?当然,调用itemview的目的是调用上下文。如果上下文存在于其中,那么itemview也派生自另一个类。它是从视图类派生的吗?View类有这样的上下文,我猜对吗?我如何用“Holder”对象调用这个itemView?

5.)这个onCreateViewHolderhtml" target="_blank">返回LandmarkHolder(binding)对象。然后需要在其他地方调用这个函数才能工作。(当然,通常应该调用它)但是它是从哪里调用的?在模拟器本身上?

RecyclerViewAdapterRecycler_row.xmlMainActivity.xml

为什么绑定本身不是视图?

共有1个答案

姜育
2023-03-14

我不明白你所有的问题,但也许这个概述会有所帮助。

ViewBinding接受您的每个XML布局,并为它们创建一个绑定类,该类由匹配每个具有ID的视图的属性组成,再加上一个名为root的属性,该属性保存顶级视图。它还具有名为bindinvalate的静态函数。因此,如果您有这样的布局:

<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传递给该构造函数。绑定本身不是视图。RecycerView.ViewHolder也有这个ItemView的属性,所以当您创建自己的具有绑定的视图holder时,有两种不同的方法来访问根视图,可以使用holder.binding.rootholder.ItemView。但是,binding.root将是LinearLayout类型,ItemView将是较不特定的ViewGroup类型。

adapter.onCreateViewholder()在需要显示另一个视图并且没有可以回收的以前的视图时由recyrerView调用。

 类似资料:
  • 我在你的论坛上潜伏了一段时间,他们在我遇到的各种问题上给了我巨大的帮助,所以谢谢!:d 我正试图创建我的第一个android应用程序,这是一个纸牌游戏,名为shithead,我和我的朋友们过去经常玩。 我觉得我必须非常接近,我只是错过了一些与android或android Studio工作的关键语法。 在我的卡片对象中,我构建了一个字符串idText,它与我保存在Android Studio中我的

  • 也许以前有人问过这个问题,但我似乎找不到一个准确的答案或解决办法。我开始使用RecycerView,并使用LinearLayoutManager实现了它。现在,我想添加自定义的页眉和页脚项,这些项不同于RecycerView中的其他项。页眉和页脚不应该粘,我希望他们滚动与其余的项目。有人能指出一些例子如何做到这一点或只是分享想法。我会非常感激的。THX

  • 我创建了基于创建列表和卡片指南的RecolyerView示例。我的适配器有一个模式实现,只用于扩展布局。 问题是滚动性能不佳。这在一个只有8个项目的RecycleView中。 在一些测试中,我验证了在Android L中不会出现这个问题。但在KitKat版本中,性能的下降是明显的。

  • 我试图在片段中的RecyyerView上设置一个click listener我不知道如何调用片段中的活动我只知道在构造函数中解析上下文,但clickListener以前没有这样做,我试过了,但它根本不起作用 我怎么能做到这一点我试过男人的事情它不起作用 如果我这样做,它会显示红线。在getContext()下;

  • 我知道RecycerView类中没有默认的选择方法,但我尝试了以下方法, 在尝试这段代码时,我得到了预期的输出,但完全不是。 我将用图像来解释这一点。 我如何克服这个问题?有时,如果我快速滚动列表,就会选择其他项目。如何克服这个问题呢? 更新 当我试图在之后使用时,

  • 我尝试在中的之前添加:,但没有任何意义。有人看到是什么引起的吗? 代码如下: 主要活动: 编辑。如果我将自定义数据输入到中,则不会出现日志警告。