RecyclerView에서 Item 위치를 가져오는 두 가지 방법
1293 단어 안드로이드 에센스 스티커
RecyclereView에서는 현재 Item 위치 정보를 가져올 때 getadapterPosition() 방법과 getLayoutPosition() 방법 두 가지 방법이 있는데, 이에 대응하는 소스는 각각 다음과 같다.
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에서 현재 표시된 어댑터의 위치를 반환합니다.getLayoutPosition은 최신 Layout의 위치 정보를 반환합니다.양자는 일반적인 상황에서 얻은 결과는 일치한다.
notify DataSetChanged() 작업을 할 때 어댑터에서 데이터의 업데이트와 Layout 레이아웃의 업데이트는 선후 시간차가 있다. 어댑터 데이터가 업데이트되었지만 Layout 레이아웃은 아직 갱신되지 않았기 때문에 GetAdapterPostion과 GetLayoutPosition 또는 자의 결과를 통해 차이가 있을 수 있다.
RececlerView는 Layout이 범람하기 전에 어댑터의 업데이트를 처리하지 않기 때문에 실제 보이는 Layout의 데이터와 어댑터의 실제 데이터가 차이가 난다.그러나 다행히 이 시간차는 보통 16ms를 넘지 않기 때문에 시각적으로 영향을 미치지 않는다. 그러나 이럴 때 getAdapterPostion()을 통해 원하는 반환값은 NO 이다.POSITION(-1), 이 결과를 사용할 때 이상 처리를 해야 할 수도 있습니다. 그렇지 않으면 Array Index Out Of Bounds Exception의 이상이 발생할 수 있습니다.
어댑터 데이터가 업데이트된 후 레이아웃이 다시 옮겨진 후에만 Layout의 위치 정보가 업데이트됩니다.그 전에 getLayoutPosition()을 통해 얻은 위치 정보는 레이아웃을 업데이트하기 전의 위치 정보이기 때문에 getLayoutPosition을 통해 얻은 결과는 더러운 데이터일 수 있습니다.