본문 바로가기
Android 개발/Debug, ADB, CrashLytics, LogCat

ArrayIndexOutOfBoundsException과 ViewHolder의 getAdapterPosition사용

by Developer88 2019. 10. 18.
반응형

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의 아이템을 클릭하는 기능을 추가하면서,

빼먹게 되는 부분인데요.

 

버그 리포트를 받고 뒤늦게 후회하기 보다는,

미리 체크해 주어야 합니다.

 

더 좋은 방법이 있다면 이 글을 통해서 업데이트 하도록 하겠습니다.

 

728x90

댓글