holder.getAdapterPosition()与onBindViewHolder()中构造函数的position属性有什么区别

Shu*_*ubh 3 java android

这是我的代码 -

public void onBindViewHolder(myViewHolder holder, int position) {

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

        holder.position = position;
    }
Run Code Online (Sandbox Code Playgroud)

我收到了警告

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

所以我对1和2感到困惑,我应该选择哪个?为什么?正如它说getAdapterPosition()提供更新的位置,我从列表中获取基于位置的值.

谢谢.

Rob*_*bbe 8

你得到的警告不是关于使用positiongetAdapterPosition().这是关于保存位置:

holder.position = position;
Run Code Online (Sandbox Code Playgroud)

您不需要保存持有人的位置,因为它的位置可以改变,您可以随时通过呼叫获得其位置holder.getAdapterPosition();

来自文档:

请注意,与ListView不同,如果项目的位置在数据集中发生更改,则RecyclerView不会再次调用此方法,除非项目本身无效或无法确定新位置.因此,您只应在获取此方法中的相关数据项时使用position参数,并且不应保留它的副本.如果您稍后需要某个项目的位置(例如,在单击侦听器中),请使用具有更新的适配器位置的getAdapterPosition().

关于使用哪个:

如果在onBindViewHolder方法内部调用,则两者都应返回相同的结果.我建议使用,position因为它是最简单和最安全的.