일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- ActiveMovieControl
- Eclipse
- 보안
- 리눅스
- C++
- 코틀린
- OOM
- build.gradle
- 안철수
- linux
- Android
- ActiveX
- 악성코드
- git
- KTS
- c
- 안드로이드 개발
- 구글
- 자바
- Android 4.1
- kotlin
- 탐지기법
- mime
- 노개북
- 개발
- java
- 하버드
- 안드로이드
- gradle
Archives
- Today
- Total
꿈소년의 개발 이야기
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 호출 메서드를 통해서 업데이트 처리하면 된다.
'Android Development' 카테고리의 다른 글
Android Studio environment setting (0) | 2019.05.04 |
---|---|
Flutter init (0) | 2019.01.30 |
Vector drawable, error and backward compatibility (0) | 2018.09.12 |
Jsoup & encoding & charset & html (0) | 2018.01.11 |
페이스북 앱 링크 연결 (link to Facebook app if installed in device) (0) | 2018.01.05 |