RecyclerViewでItem位置を取得する2つの方法


転載元:RecyclerViewでItemの位置を取得する2つの方法
RecyclereViewで現在のItem位置情報を取得する方法としては、getAdapterPosition()メソッドとgetLayoutPosition()メソッドの2つがあり、それぞれ次のように対応しています.
public final int getAdapterPosition() {
    if (mOwnerRecyclerView == null) {
        return NO_POSITION; 
    }
    return mOwnerRecyclerView.getAdapterPositionFor(this);
}

public final int getLayoutPosition() {
    return mPreLayoutPosition == NO_POSITION ? mPosition : mPreLayoutPosition;
}

getAdapterPosition()は、ViewHolderで現在表示されているAdapterの位置を返します.getLayoutPositionは最新のLayoutの位置情報を返します.両者は一般的に,得られた結果は一致した.
ある場合、notifyDataSetChanged()操作の場合、Adapterにおけるデータの更新とLayoutレイアウトの更新は前後する時間差があり、Adapterデータが更新されたにもかかわらずLayoutレイアウトはまだ更新されておらず、getAdapterPostionとgetLayoutPositionまたは者による結果に差がある.
RececlerViewはLayoutが遍歴するまでAdapterの更新を処理しないので、実際に見たLayoutのデータとAdapterの実際のデータには違いがあります.ただし、この時間差は一般的に16 msを超えることはないので視覚的には影響しないのが一般的ですが、このときgetAdapterPostion()で得たい戻り値はNO_POSITION(-1)は、この結果を使用する場合、異常処理が必要になる場合があります.そうでないと、ArrayIndexOutOfBoundsExceptionの異常が発生する可能性があります.
Adapterデータが更新された後、レイアウトが再遍歴された後にのみ、Layoutの位置情報が更新されます.その前にgetLayoutPosition()で取得した位置情報は、レイアウトを更新する前の位置情報なので、getLayoutPositionで取得した結果、ダーティデータである可能性があります.