【问题标题】:What is difference between holder.getAdapterPosition() and position attribute from constructor in onBindViewHolder() [duplicate]holder.getAdapterPosition() 和 onBindViewHolder() 中构造函数的位置属性有什么区别[重复]
【发布时间】:2016-08-16 17:37:12
【问题描述】:

这是我的代码 -

public void onBindViewHolder(myViewHolder holder, int position) {

        //1. details obj = list.get(holder.getAdapterPosition());
        //2. details obj = list.get(position);

        holder.position = position;
    }

我收到警告

不要将位置视为固定;仅立即使用并致电 holder.getAdapterPosition() 稍后查找 RecyclerView 不会 当 item 的位置发生变化时再次调用 onBindViewHolder 数据集,除非项目本身无效或新位置 无法确定。因此,您应该只使用 获取this里面的相关数据项时的位置参数 方法,不应保留副本。如果你需要的位置 稍后的项目(例如在点击侦听器中),使用 getAdapterPosition() 稍后会有更新的适配器位置。

所以我对 1 和 2 感到困惑,我应该更喜欢哪个,为什么?正如它所说,getAdapterPosition() 给出了更新的位置,我正在根据位置从列表中获取值。

谢谢。

【问题讨论】:

    标签: java android


    【解决方案1】:

    您收到的警告与使用 positiongetAdapterPosition() 无关。这是关于保存位置:

    holder.position = position;
    

    您不需要将头寸保存在您的持有人中,因为它的头寸可以改变,您可以随时通过调用holder.getAdapterPosition()获得它的头寸;

    来自文档:

    注意,与ListView不同的是,RecyclerView不会调用这个方法 如果项目在数据集中的位置发生变化,除非 项目本身无效或无法确定新位置。 因此,您应该只使用 position 参数,而 获取此方法内的相关数据项,不应保留 它的副本。如果您稍后需要某个项目的位置(例如,在 单击侦听器),使用 getAdapterPosition() 将更新 适配器位置。

    关于使用:

    如果在onBindViewHolder 方法中调用,两者应该返回相同的结果。我会推荐使用position,因为它最简单、最安全。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-08-30
      • 2013-08-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多