当前位置: 首页 > 面试题库 >

何时调用onBindViewHolder及其工作方式?

公孙联
2023-03-14
问题内容

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

这是我的代码

    public void onBindViewHolder(myViewHolder holder, int position) {

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

问题答案:

让我从一些背景知识开始(您可能已经了解了,但是需要进行解释onBindViewHolder())。

RecyclerView用于显示项目的长列表(或网格)。假设您要显示100行。一种简单的方法是只创建100个视图,每行一个视图,然后将它们全部布局。但这将是浪费的,因为它们中的大多数将不在屏幕上,因为可以说其中只有10个适合屏幕。

因此,RecyclerView仅创建屏幕上的10个视图。这样,您的速度和内存使用率将提高10倍。但是,当您开始滚动并需要开始显示下一个视图时会发生什么?

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

这就是为什么RecyclerView利用以下事实:滚动并在屏幕上显示新行时,旧行也会从屏幕上消失。代替为每个新行创建新视图,而是通过将新数据绑定到旧视图来对其进行
回收 和重用。

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



 类似资料:
  • 问题内容: 我的多线程概念薄弱,正在尝试学习。 在Java中,我所知道的是,我们不能多次调用一个线程: 据我所知,当您再次调用该函数时,它会引发异常,因为一旦线程退出方法,并且您试图再次初始化事物,该线程的关联堆栈就会被破坏。 在那种情况下,我对线程池的了解是,它提供了更好的性能并节省了时间,因为不需要创建新线程(我在此阅读)。 如果不需要在线程池中创建新线程,那么它如何与刚刚完成其run方法的同

  • 问题内容: 我的RecyclerView不会调用onCreateViewHolder,onBindViewHolder,因此,在recyclerview中不会显示任何内容。我放置了调试日志,但未显示日志。可以是什么? 我的适配器: 我将用于在RecyclerView中添加项目。 在片段中: XML档案: comment_row xml文件: 我将使用以下代码将项目添加到RecyclerView:

  • 我有一个具有多个视图类型的viewholder。 滚动时,只有当更改值时,才会调用onBindViewHolder。这会导致我的列表项无法正确更新。 这是虫子吗?或者我做错了什么。从新的类来看,这似乎是非常奇怪的行为。 这是我的适配器: 我还提取了如下内容: 对于部分 它对第一个可见行运行良好,但随后失败。

  • 我的多线程概念很弱,正在努力学习。 在Java中,我所知道的是,我们不能多次调用线程: 据我所知,当您再次调用时,它会引发异常,因为线程的关联堆栈一旦退出方法,并且您再次尝试初始化时就会被破坏。 在那种情况下,我对线程池的了解是,它给出了更好的性能&节省了时间,因为不需要创建新线程(我在这里读到)。 如果在线程池场景中不需要创建新的线程,那么它是如何与刚完成其run方法的同一线程一起工作的,该线程

  • 我知道如何禁用按钮,以防止它被点击两次。然而,如果我想再次启用它,只要它安全,我可以做类似的事情,我调用setenabled(true)在onclick??是一调用setenabled(false)就禁用按钮,还是只在onclick函数完成时禁用?

  • 注意:这是一个命名的模块java项目 为什么在java中获取资源是这样工作的?我得到了两个包,在main func中,它们都以jar文件语法打印“/respath/tmp.txt”的URL,并对应于它的类。 这些代码是如何相互区分的? 注意:这是一个命名的模块java项目