꿈소년의 개발 이야기

Android java.lang.IndexOutOfBoundsException: Inconsistency detected. Invalid item position 3(offset:3).state:4 android.support.v7.widget.RecyclerView 본문

Android Development

Android java.lang.IndexOutOfBoundsException: Inconsistency detected. Invalid item position 3(offset:3).state:4 android.support.v7.widget.RecyclerView

꿈소년 2018. 11. 1. 16:49
반응형
 

RecyclerView 를 사용하다 보면, 아래 같은 에러를 마주치는 경우가 있다.

java.lang.IndexOutOfBoundsException: Inconsistency detected.
	Invalid item position 3(offset:3).state:4 android.support.v7.widget.RecyclerView

보통 RecyclerView 에서 가져온 adapter 에 새로운 데이터 리스트를 넣어 notifyDataSetChanged() 까지 처리를 했는데도,

어느 정도 동작을 하다가 오류를 발생하게 되는 경우가 더러 있다.

 

일반적으로 RecyclerView 어댑터에 업데이트할 데이터 목록을 넣어 줄텐데, 

그럴 경우 참조로 넘기도록 처리하면서 이슈가 생기는 경우가 많다.

 

call by reference, call by value 개념을 이해하면 바로 알 수 있는 실수인데, 

보통 리스트를 사용해서 데이터들을 담은 후 어댑터의 리스트 객체를 새로 생성하고,

업데이트 할 데이터를 모두 추가해서 처리하면 이런 이슈는 해결된다. addAll 로 처리하면 된다. 

 

참고:

DiffUtil 을 사용해서 처리하면 notifyDataSetChanged() 를 호출하는 것보다 훨씬 나은 사용자 경험이 제공된다. 

전체 데이터를 모두 변경 처리하는 것보다 일부 변경된 것만 업데이트 해주는 것이 좋으니까.

이 경우에는 기존 어댑터의 데이터 리스트를 clear() 한 후 addAll() 을 해서 넣어 준 후, 

notifyDataSetChanged() 호출이 아닌 DiffUtil 호출 메서드를 통해서 업데이트 처리하면 된다.