RecyclerView를 학습하면서 리스트의 아이템 항목 선택 시, 해당 아이템의 인덱스를 가져오는 과정에서 학습한 내용이다
RecyclerView의 아이템 항목을 선택하고, 하나만 선택될 수 있도록 새로 선택한 항목이 기존의 항목인지 비교하는 로직을 작성했다.
1. ViewHolder의 위치 참조 - int position
@Override
public void onBindViewHolder(@NonNull RvAdapter.MyViewHolder holder, int position) {
holder.itemView.setOnClickListener(v -> {
// 현재 아이템의 위치 조회
int currentPosition = position;
});
}
처음에는 ViewHolder의 위치를 position 파라미터로 가져와 기존 아이템의 위치로 설정하고, 새롭게 선택한 아이템의 position과 비교하도록 구현하였다.
하지만 position의 값을 직접 저장하고 사용하는 것은 권장되지 않는다.
실제로 position 값이 RecyclerView의 데이터 세트 변경(항목 추가, 삭제, 이동...)등으로 인해 동적으로 변할 수 있기 때문이다.
2. ViewHolder의 위치 참조 - getAdapterPosition()
int currentPosition = holder.getAdapterPosition();
위 코드는 RecyclerView를 하나만 사용할때는 괜찮으나 여러 RecyclerView를 사용하게 되면 문제가 발생한다.
어댑터 하나에 바인딩된 리스트에서 position을 원하는지
RecyclerView 전체에 대한 position을 원하는지에 대한 혼란이 있기 때문이다.
또한 어댑터의 데이터 세트가 변경되어 ViewHolder의 위치가 더 이상 유효하지 않게 될 경우
RecyclerView.NO_POSITION을 반환할 수 있다. => 추가적인 검사가 필요함

getAdapterPosition() 메소드는 현재 deprecated 상태이며 대신하여 getBindingAdapterPosition()을 사용해야 한다.
3. ViewHolder의 위치 참조 - getBindingAdapterPosition()
int currentPosition = holder.getBindingAdapterPosition();
이 메소드는 ViewHolder가 현재 바인딩된 어댑터에서의 위치를 반환한다.
이것은 여러 어댑터가 RecyclerView를 공유할 때 유용하다.
즉, getBindingAdapterPosition()은 더 명확하게 현재의 ViewHolder가 어떤 어댑터에 바인딩되어 있는지를 반영한다.
getAdapterPosition()이 deprecated된 이후 getBindingAdapterPosition() 메소드 사용을 권장한다.
다음과 같은 라이브러리를 gradle에 추가하여 사용할 수 있다.
dependencies {
implementation ("androidx.recyclerview:recyclerview:1.2.0-alpha02") // 또는 더 높은 버전
}
'Android' 카테고리의 다른 글
[Android] RecyclerView의 DiffUtil 알아보기 (0) | 2024.03.06 |
---|---|
[Android] absoluteAdapterPosition 와 getBindingAdapterPosition 차이점 (0) | 2024.03.04 |
[Android] Fragment 생성 방법 정리 / newInstance() (0) | 2024.03.02 |
[Android] RecyclerView - ViewHolder의 재사용과 상태 관리의 중요성 (선택 이벤트 처리) (0) | 2024.03.01 |
[Android] RecyclerView 메소드에서의 payload (0) | 2024.02.28 |