문서가 충분하지 않아 죄송합니다.
어댑터 내용이 변경되면 (그리고 호출 할 때 notify***()
) RecyclerView는 새 레이아웃을 요청합니다. 그 순간부터 레이아웃 시스템이 새 레이아웃 (<16ms)을 계산하기로 결정할 때까지 레이아웃이 아직 어댑터 변경 사항을 반영하지 않았기 때문에 레이아웃 위치와 어댑터 위치가 일치하지 않을 수 있습니다.
사용 사례에서 데이터는 어댑터 콘텐츠와 관련이 있으므로 (데이터가 어댑터 변경과 동시에 변경된다고 가정합니다) adapterPosition
.
그러나 호출하는 경우 notifyDataSetChanged()
모든 것을 무효화하므로 RecyclerView는 다음 레이아웃이 계산 될 때까지 ViewHolder의 어댑터 위치를 알지 못합니다. 이 경우 ( ) getAdapterPosition()
를 반환 합니다.RecyclerView#NO_POSITION
-1
당신이 호출 한 경우하지만 말을 할 수 notifyItemInserted(0)
, getAdapterPosition()
위치에 이전에 있던 ViewHolder의이 0
반환 시작됩니다 1
즉시. 따라서 세분화 된 알림 이벤트를 전달하는 한 항상 양호한 상태에 있습니다 (새 레이아웃이 아직 계산되지 않은 경우에도 어댑터 위치를 알고 있음).
또 다른 예로, 사용자 클릭에 대해 무언가를하고있는 경우를 getAdapterPosition()
반환 NO_POSITION
하면 사용자가 무엇을 클릭했는지 모르기 때문에 해당 클릭을 무시하는 것이 가장 좋습니다 (예 : 항목 조회를위한 안정적인 ID와 같은 다른 메커니즘이없는 경우).
레이아웃 위치가 좋을 때 편집
당신이 사용하는 말을하자 LinearLayoutManager
및 현재 클릭 한 항목 위의 ViewHolder에 액세스하려면. 이 경우 레이아웃 위치를 사용하여 위의 항목을 가져와야합니다.
mRecyclerView.findViewHolderForLayoutPosition(myViewHolder.getLayoutPosition() - 1)
레이아웃 위치는 사용자가 현재 화면에서보고있는 것과 일치하기 때문에 사용해야합니다.