본문 바로가기
Dev Log/Android

[Android] java.lang.IndexOutOfBoundsException: Inconsistency detected... 예외 처리하기

by 삽질하는큐 2017. 1. 16.

얼마 전 java.lang.IndexOutOfBoundsException: Inconsistency detected. Invalid view holder adapter positionViewHolder라는 예외가 발생하여 한 동안 어떻게 할지 고민했다. 관련 링크 : http://stackoverflow.com/questions/31759171/recyclerview-and-java-lang-indexoutofboundsexception-inconsistency-detected-in


나의 경우에는 예외가 발생했던 알고리즘은 다음과 같았다.

Swipe-To-Refresh를 한다. -> Refresh를 시작할 때 RecyclerView에 연결된 ArrayList를 clear()한다. -> 서버에서 새로 값을 읽어온다. -> 값을 다 읽어오면 notifyDataSetChanged().


만약 이 과정 중에서 기존의 RecyclerView를 빠르게 드래그 한다면, 아까까지만 해도 있었던 Layout의 길이 만큼 다음 객체를 불러와서 화면으로 표시하고, 불러와서 화면으로 표시하고... 이러한 작업을 반복해야 한다. 하지만, 기존의 ArrayList를 지워버렸으니, 이러한 일이 생길 수밖에 없다.


따라서, 개선한 방법은 이렇다.

Swipe-To-Refresh를 한다. -> Refresh하는 동안 기존의 ArrayList는 그대로 두고 새로운 ArrayList객체를 생성하여 값만 불러들인다. -> 데이터의 파싱이 완료되어 ArrayList가 완성되면, 이제 기존의 ArrayList를 지우고 새로운 ArrayList를 addAll()한다.


Inconsistency detected예외가 사라졌다!