【问题标题】:How to cache viewholder view references in android recyclerView如何在android recyclerView中缓存viewholder视图引用
【发布时间】:2016-10-08 17:56:31
【问题描述】:

From the android docs

这个新的 ViewHolder 应该用一个可以表示给定类型的项目的新视图来构造。您可以手动创建新视图,也可以从 XML 布局文件中扩展它。

但它继续说:

新的 ViewHolder 将用于使用 onBindViewHolder(ViewHolder, int, List) 显示适配器的项目。由于它将被重复用于显示数据集中的不同项目,因此最好缓存对 View 的子视图的引用,以避免不必要的 findViewById(int) 调用。

我可以举个例子吗?通过缓存对视图的子视图的引用而不是调用 findViewbyId。我的意思是在 viewholders 构造函数中我已经在调用 findviewbyId。像这样:

public class MyViewHolder extends RecyclerView.ViewHolder{
    public TextView review;
    public ImageView iv;


    public MyViewHolder(View view) {
        super(view);
        review = (TextView) view.findViewById(R.id.gridview_text);
        iv = (ImageView) view.findViewById(R.id.gridview_image);

    }
}

这不正确吗?这些怎么缓存?

【问题讨论】:

  • 它被缓存了,因为单个视图“模板”用于数据集中将填充您的 RecyclerView 的所有项目,因此它们只需要启动一次。你所拥有的是正确的 - 确保任何 onClick 侦听器要么在你的持有者的构造函数中,要么通过接口处理,永远不要在 onBindViewHolder() 方法中。
  • 每次实例化 viewHolder 时,都会根据我的示例调用 findViewById。不是为列表中创建的每个单元格调用 MyViewHolder 的构造函数吗?如果每个列表项都调用它,那么它如何称为缓存。

标签: android android-recyclerview


【解决方案1】:

您发布的内容正是他们在视图中缓存视图的意思。这样可以避免每次需要绑定数据时都必须使用findViewById()

【讨论】:

  • 我有点困惑。对于 recyclerView 中的每个单元格,都需要创建一个 viewHolder 对象。所以 findviewById 最初被调用了很多次。但是当一个单元被回收时,我假设一个新的 viewHolder 对象不会被实例化,它只会从某个池中重用。这是正确的吗?
  • @j2emanue 是的,没错。因此名称为“RecyclerView”。这就是为什么建议您最初使用findViewById() 并保留对这些视图的引用(就像您的代码一样),这样您在将数据绑定到视图时就不必再这样做了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-28
  • 2015-04-16
  • 1970-01-01
  • 2019-09-16
相关资源
最近更新 更多