RecyclerView를 이용해서,
list상의 아이템 중 하나를 유저가 클릭한 경우,
해당 View의 position을 알아오기 위해, ViewHolder에서 getAdapterPosition을 사용하는 경우가 있습니다.
이런 경우에 ArrayIndexOutOfBoundsException이 발생하는 경우가 있는데요.
오늘은 이것의 원인과 대응 방법을 정리해 보도록 하겠습니다.
1. ArrayIndexOutOfBoundsException의 원인
ViewHolder에서 getAdapterPostion()메소드를 호출 한 경우,
디폴트 값은 "RecyclerView.NO_POSITION"인데요.
이 값이 바로 "-1"입니다.
getAdapterPosition메소드는, 아이템이 있을 경우에만 해당하는 position값을 반환하는데요.
보통은 리스너를 이용해서, onClick메소드에서 getApdaterPosition값을 아래와 같이 넘겨주게 되는데요.
이 때, 아이템이 어댑터에서 제거되었거나 혹은 다른 이유로 존재하지 않는다면,
NO_POSITION(-1)을 리턴하게 됩니다.
실제로 버그 리포트를 보도록 하겠습니다.
만약 아래 이미지와 같이, index에서 -1이 찍히고,
Viewholder의 getAdpaterPostion을 한 곳에서 ArrayIndexOutOfBoundsException이 발생했다면,
getAdapter의 리턴값으로 NO_POSITION을 주었고,
아이템이 없다고 하는 것 입니다.
2. 대응 방법
이에 대응하기 위해서는,
getAdapterPosition()메소드의 리턴값이 NO_POSITION인지 확인을 해 주어야 하는데요.
아래 이미지와 같이 getAdapter를 저장했다가, return하는 값이 NO_POSITION은 아닌지,
확인해 주면 됩니다.
이 부분은 대응하기 쉬운 간단한 Exception이긴 하지만,
RecyclerView의 아이템을 클릭하는 기능을 추가하면서,
빼먹게 되는 부분인데요.
버그 리포트를 받고 뒤늦게 후회하기 보다는,
미리 체크해 주어야 합니다.
더 좋은 방법이 있다면 이 글을 통해서 업데이트 하도록 하겠습니다.
'Android 개발 > Debug, ADB, CrashLytics, LogCat' 카테고리의 다른 글
Crashlytics 구현해서 catch 한 Exception 로그 받기 # 에러 로깅 (0) | 2022.11.26 |
---|---|
자주 사용하는 ADB 명령어 정리 # logcat (0) | 2021.03.09 |
Kotlin Exception 처리 방법 # RunCatching 과 try, catch (1) | 2020.02.13 |
WindowManager$BadTokenException 대응하기 (0) | 2020.02.06 |
Android 디버깅 방법 및 Tip에 대한 정리 (0) | 2020.01.29 |
Kotlin에서 try catch finally로 처리하는 Exception (0) | 2020.01.28 |
RxJava2의 Global Error Handler 대응 #UndeliverableException (1) | 2019.10.16 |
APK 빌드 시 Lint found fatal errors 에러가 발생할 경우의 대응 (0) | 2019.10.06 |
ADB(Android Debug Bridge)를 맥 OS에서 사용하는 방법 (2) | 2019.09.01 |
Firebase의 CrashLytics를 Slack과 연동해서 알림받기 (1) | 2019.05.23 |
댓글