【问题标题】:When onBindViewHolder is called and how it works?何时调用 onBindViewHolder 以及它是如何工作的?
【发布时间】:2016-05-30 10:24:32
【问题描述】:

我是一个初学者,我在理解一段代码时遇到了麻烦。有人可以解释一下这个功能什么时候触发以及它的用途是什么?

这是我的代码:

    public void onBindViewHolder(myViewHolder holder, int position) {

        RecViewHolder currentdata = data.get(position);
        holder.favChecker = currentdata.getFavChecker();
        holder.serialID = currentdata.getSerialID();
        holder.theClassName = currentdata.getTheClassName();
}

【问题讨论】:

标签: java android


【解决方案1】:

让我从一点背景开始(你可能已经明白了,但需要解释一下onBindViewHolder())。

RecyclerView 旨在显示项目的长列表(或网格)。假设你想显示 100 行的东西。一种简单的方法是只创建 100 个视图,每行一个,然后将它们全部布置出来。但这会很浪费,因为它们中的大多数会不在屏幕上,因为假设只有 10 个适合屏幕。

所以RecyclerView 只创建屏幕上的 10 个视图。通过这种方式,您可以获得 10 倍的速度和内存使用率。但是当您开始滚动并需要开始显示下一个视图时会发生什么?

同样,一个简单的方法是为您需要显示的每个新行创建一个新视图。但是通过这种方式,当您到达列表末尾时,您将创建 100 个视图,并且您的内存使用情况与第一种方法相同。而且创建视图需要时间,因此您的滚动很可能不会流畅。

这就是为什么RecyclerView 利用了这样一个事实,即当您滚动并且新行出现在屏幕上时,旧行也会从屏幕上消失。旧视图不是为每个新行创建新视图,而是通过将新数据绑定到旧视图来回收和重用。

这恰好发生在onBindViewHolder()。最初,您将获得新的未使用的视图持有者,并且您必须用要显示的数据填充它们。但是当您滚动时,您将开始获得用于离开屏幕的行的视图持有者,您必须用新数据替换他们持有的旧数据。

【讨论】:

  • 在 SDK 中升级现在我得到了不同的行为,即 onBindViewHolder 有争议地调用。
  • @Abhishek 我认为这也是我对onBindViewHolder 行为的观察。我正在尝试编写一个应用程序,该应用程序列出任意数量的带有图像的项目(数千个项目),当我记录对onBindViewHolder 的调用时,记录了所有数千个项目。
  • @patrickjason91 我浏览了一些链接。有一些情况,比如当我们使用 Recycler View Inside Scroll View OnBindViewHolder 被连续调用时,在一些 SDK 中,recycler view 也不能像预期的那样工作,所以我们必须使用稳定的 recycler view 支持。
  • @Abhishek 在搜索一些问题和答案时,有人声称该问题是由于RecyclerView 的较新版本造成的,并且该问题也出现在 Pre-Lollipop 设备上。我正在使用旧版本/棒棒糖前设备进行测试编辑:我现在测试到棒棒糖后设备牛轧糖,问题仍然存在
  • @Marcin,您说“RecyclerView 只创建屏幕上的 10 个视图”,第 11 个视图 onBindViewHolder() 什么时候调用?即,第 10 项中应有多少可见?
【解决方案2】:

RecyclerView调用,在指定位置显示数据。此方法用于更新 itemView 的内容以反映给定位置的项目。

更多信息请查看RecyclerView.Adapter#onBindViewHolder

【讨论】:

    猜你喜欢
    • 2017-11-21
    • 1970-01-01
    • 1970-01-01
    • 2011-10-27
    • 2020-02-08
    • 2015-05-28
    • 2020-08-06
    相关资源
    最近更新 更多