5

Here is my code -

public void onBindViewHolder(myViewHolder holder, int position) {

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

        holder.position = position;
    }

I am getting a warning

Do not treat position as fixed; only use immediately and call holder.getAdapterPosition() to look it up later RecyclerView will not call onBindViewHolder again when the position of the item changes in the data set unless the item itself is invalidated or the new position cannot be determined. For this reason, you should only use the position parameter while acquiring the related data item inside this method, and should not keep a copy of it. If you need the position of an item later on (e.g. in a click listener), use getAdapterPosition() which will have the updated adapter position later.

So i am confused from 1 and 2 which should i prefer and why? As it says getAdapterPosition() gives updated position and i am getting values from list based on position.

Thank you.

Shunan
  • 3,165
  • 6
  • 28
  • 48

1 Answers1

9

The warning you get is not about using position or getAdapterPosition(). It is about saving the position:

holder.position = position;

You don't need to save the position in your holder, because its position can change and you can always get its position by calling holder.getAdapterPosition();

From the docs:

Note that unlike ListView, RecyclerView will not call this method again if the position of the item changes in the data set unless the item itself is invalidated or the new position cannot be determined. For this reason, you should only use the position parameter while acquiring the related data item inside this method and should not keep a copy of it. If you need the position of an item later on (e.g. in a click listener), use getAdapterPosition() which will have the updated adapter position.

About which to use:

Both should return the same result if called inside the onBindViewHolder method. I would recommend using position because it is easiest and safest.

Robbe
  • 2,610
  • 1
  • 20
  • 31