이번 공부 내용은 getAdapterPosition() Deprecated 되어서 이에 따른 해결 방법을 알아보겠다.
# getAdapterPosition()가 Deprecated 된 이유
해결 방법을 알아보기 전 Deprecated가 된 이유를 먼저 알아보자
2020년 2월부터 Deprecated가 되었고, 공식 문서에서는 아래 사진과 같이 설명하고 있다.

이 메서드는 더 이상 사용되지 않습니다.
이 방법은 어댑터가 다른 어댑터를 중첩할 때 혼동됩니다. 어댑터의 컨텍스트에서 호출하는 경우 getBindingAdapterPosition()을 호출하거나 RecyclerView가 표시하는 위치를 호출하려면 getAbsoluteAdapterPosition()을 호출해야 합니다.
공식 문서에서 설명한 글을 그대로 번역한 글이다.
한마디로 getAdapterPosition() 메소드는 Adapter가 다른 Adapter를 중첩하는 경우 어느 adapter의 위치인지 혼란스럽기 때문에 Deprecated가 되었다고 설명한다.
# 해결 방법
해결 방법은 두 가지가 있다 getBindingAdapterPosition(), getAbsoluteAdapterPosition() 두 가지에 대해 알아보자
## getBindingAdapterPosition()
- Adapter내의 포지션을 반환해준다
## getAbsoluteAdapterPosition()
- RecyclerView에서의 포지션을 반환해준다
한 Adapter를 사용했을 시 위 두 메소드의 값은 같다.
하지만 ConcatAdapter사용 시 여러 Adapter를 이어 하나의 RecyclereView를 표시한다면 두 값은 다르다.
예를 들어 A, B, C Adapter를 생성하고 ConcatAdapter로 이어주는 경우
B Adapter의 두 번째 아이템 위치를 두 메소드를 이용해 가져온다면
getBindingAdapterPosition()는 터치한 Adapter 내에서의 위치 +1을 반환한다
getAbsoluteAdapterPosition()는 RecyclereView에서의 절대 위치인 A Adapter의 item 개수 + B Adapter에서의 위치 -1인 값을 반환한다.
아래 사진을 보면 좀 더 이해가 잘 될 것이다.

# 정리를 하자면
한 Adapter를 사용하여 RecyclerView를 이용한다면 둘 중에 아무거나 사용해도 무관하다.
하지만 ConcatAdapter로 여러 Adapter를 이어 하나의 RecyclerView에 표시한다면 두 메소드 중 각 기능에 맞는 메소드를 사용해야 한다.
참고
https://growup-lee.tistory.com/entry/Android-ViewHolder-getAdapterPosition-Deprecated
https://developer.android.com/reference/androidx/recyclerview/widget/RecyclerView.ViewHolder
https://stackoverflow.com/questions/63068519/getadapterposition-is-deprecated
'소소한 개발 꿀팁' 카테고리의 다른 글
[Git] .gitignore 파일이란? (0) | 2023.02.05 |
---|---|
안드로이드 스튜디오 로그캣(Logcat) 이전 버전으로 돌아가기(돌핀 이전) (0) | 2022.11.27 |
프래그먼트 안에서 Activity,context 가져오기 (0) | 2022.03.30 |
[Android]안드로이드 프래그먼트 종료(finish) 시키기 (0) | 2022.03.02 |
[Android]안드로이드 개발시 다크 모드 무시/해제 하기 (0) | 2022.03.01 |