RecyclerView.ViewHolder-getLayoutPosition 대 getAdapterPosition
새로운 지원 라이브러리 버전 (22.x) 이후 getPosition()
의 방법 RecyclerView.ViewHolder
클래스는 주제에 언급 된 방법 대신에 사용되지 않습니다. 나는 문서를 읽는 것과 실제로 차이를 얻지 못합니다. 누군가 평신도 용어의 차이를 설명 할 수 있습니까?
다음 사용 사례가 있습니다. 어댑터에 List
를 제공하고 각 목록 항목에 대한 추가 정보를 연결할 수 있기를 원합니다. 나는 포지션-엑스트라 매핑을 가지고 있고, 보유자들이 그들의 포지션에 대한 엑스트라를 가져 와서 작업을 할 수 있도록 매핑이 가능합니다. 홀더에서 어떤 방법을 사용해야합니까?
인덱스 0과 1의 목록 항목이 위치가 바뀔 때 홀더 위치는 어떻게됩니까? 메소드는 무엇을 반환합니까?
문서가 충분하지 않아 죄송합니다.
어댑터 내용이 변경되면 (그리고 호출 할 때 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)
레이아웃 위치는 사용자가 현재 화면에서보고있는 것과 일치하기 때문에 사용해야합니다.
차이 (들)을 주장하기 위해 getAdapterPosition()
, getLayoutPosition()
및도 position
; 다음과 같은 경우를 알 수 있습니다.
1. 메소드의 position
인수 onBindViewHolder()
:
를 사용하여 position
데이터를 뷰에 바인딩 할 수 있으며 position
인수 를 사용 하여이를 수행 하는 것은 괜찮지 만 position
인수를 사용 하여 사용자 클릭을 처리 하는 것은 좋지 않으며 사용하는 경우 "다음으로 취급하지 말 것"이라는 경고가 표시 position
됩니다. 고정하고 holder.getAdapterPosition()
대신 사용 ".
2. getAdapterPosition()
:
이 메서드는 항상 업데이트 된 어댑터의 holder
. 항목을 클릭 할 때마다 어댑터에 position
. 그래서 당신은 어댑터의 논리 측면 에서이 항목의 최신 위치를 얻을 수 있습니다.
3. getLayoutPosition()
:
때때로,을 찾을 필요 position
예를 들어, 업데이트 된 레이아웃 (사용자가 지금 보는 것을 마지막으로 통과 레이아웃)의 측면에서 : 사용자가 3 분의 1을 요청하는 경우 position
그가 볼 수 있고 사용 swipe
/ dismiss
항목이나 애니메이션을 적용 또는 항목에 대한 장식 getLayoutPosition()
대신 을 사용 하는 것이 더 좋을 것입니다 getAdapterPosition()
. 왜냐하면 가장 최근에 전달 된 레이아웃과 관련하여 항목의 위치를 항상 다루고 있기 때문입니다.
'your programing' 카테고리의 다른 글
중복 키를 허용하는 C # 정렬 가능한 컬렉션 (0) | 2020.10.10 |
---|---|
절대 위치 + 스크롤링 (0) | 2020.10.10 |
`—` 또는`—` HTML 출력에 차이가 있습니까? (0) | 2020.10.10 |
RSpec에서 IT 블록과 지정 블록의 차이점 (0) | 2020.10.10 |
Objective-C : 어설 션 vs. 예외 vs. 오류 (0) | 2020.10.10 |