본문 바로가기
Android 개발/RecyclerView, List

notifyDataSetChanged 실행시에 깜박이는 현상 해결

by Developer88 2017. 7. 2.
반응형

안드로이드의 리스트뷰는 전부 RecyclerView로 한다고 해도 될 정도로,

RecyclerView는 정말 많이 사용됩니다.


RecyclerView를 사용하다가 때로는,  

intialize된 후에 각 아이템의 데이터가 수정되어서, 

다시 notifyDataSetChanged()를 해줘야 하는 경우가 생깁니다.


보통은 한번만 해주면 되는 notifyDataSetChanged()를 두번 혹은 그 이상 해야되는 경우가 있는 것인데요.

이렇게 하면 깜박임 현상이 발생하는 것을 볼 수 있습니다.


오늘은, 이 문제를 해결 하려면 어떻게 해야 하는지 정리해보겠습니다.


참고로, 이글에서는 RecyclerView의 구현과 기본적인 내용에 대해서는 생략합니다.

RecyclerView의 기본적인 내용은 아래 링크를 참조해 주세요.

>> RecyclerView 로 listview 정복 <<



1. 깜박임의 원인


이 깜박임의 원인은 notifyDataSetChanged를 하였을 때,

Adapter가 이미 존재하는 전체 데이터셋의 아이템들 중 어떤 것이 변경된 것인지 모르므로, 

viewHolder를 전부 다시 매칭시켜주면서 발생하는 것인데요.


그럼 어떻게 하면 이 문제를 해결할 수 있을까요?



2. setHasStableIds 설정


해결하기 위해서 Adapter에게 각 아이템들의 유니크한 값들이 있다고 알려주는 것을 먼저 해야하는데요.

이 역할을 하는 것이, setHasStableIds 메소드입니다.

setHasStableIds를 true로 설정해 주면, Adapter가 아이템들을 추적할 수 있고,

변동시에도 ViewHolder를 다시 매칭하는 일을 할 필요가 없겠죠.


setHasStableIds의 소스코드를 잠시 보면 아래와 같은데요.

long타입의 유니크한 id로 데이터셋의 각각의 아이템들을 나타낼수 있는가를 나타낸다고 나와있습니다.




Adapter를 구현해주고, 어댑터에 아래와 같이 setHasStableIds()메소드를 실행해주면 됩니다.




그런데, 이것만으로는 문제가 해결되지 않습니다.

유니크한 id를 갖는다고 Adapter에게 큰 소리를 쳤으니,

각 아이템들에 Unique한 아이디를 주어야 하는데요.


그것은 아래에서 구현해 보겠습니다.



3. getItemId


각 아이템의 유니크한 아이디를 부여는 것은, Adapter클래스에서 getItemId를 override 하여서 구현합니다.

아래와 같이 각 아이템에서 유니크한 값을 받도록 해주면, 이제 Adapter가 각 아이템들의 고유한 값을 가지고,

기존의 ViewHolder를 이용하게 되구요.

(참고로 getId()메소드는 별도로 설정한 데이터 모델 클래스의 id를 얻어내는 getter입니다.

만약, id값 같이 유니크한 값이 별도록 없다면, string에 hashCode()메소드를 사용해서 유니크한 값을 얻어낼 수도 있겠네요~.)

그 결과로 깜박임 현상이 사라지게 됩니다.




728x90

댓글