티스토리 뷰

반응형

프로젝트를 진행하면서 RecyclerView의 Data Set에 동적으로 아이템을 추가하여 notifyDataSetChanged() 함수를 통해 ReBinding을 시켜야하는 일이 있었습니다. 문제없이 실행되는가 싶더니 데이터가 추가 되고 RecyclerView에 반영이 되는 순간 View가 깜빡 거리는 현상이 생기더군요. 해당 포스팅에서 Adapter의 notifyDataSetChanged 실행 시 RecyclerView의 깜빡 거리는 현상을 해결하는 방법을 알아보겠습니다.


1. 깜빡거리는 원인

Adapter가 관리하는 Data Set에 데이터가 추가 / 삭제 / 갱신등이 이루어지면 notifyDataSetChanged()를 호출하여 Adapter에게 DataSet이 변경되었으니 갱신하라고 알려줘야 합니다. 이때 Adapter는 변경 된 DataSet을 가지고 View를 갱신하기 위한 작업을 진행할텐데 이때 Adapter는 자신이 가지고 있는 Data Set에서 어떤 Item이 변경되었는지를 알지 못합니다. Adapter는 새로운 Data Set 전부를 ViewHolder와 매칭시키는 작업을 진행하게 되면서 RecyclerView가 깜빡거리는 현상이 발생합니다.


2. 문제해결 1) setHasStableds 호출

해당 함수는 Adapter에게 Data Set의 각 Item들이 자신만의 고유한 값을 가지고 있다는 알려주는 기능을 합니다. 해당 함수를 통해 setHasStableds(true)를 설정해주면 Adapter가 각 Item들을 추적할 수 있고 ViewHolder를 새로 매칭시키는 일이 사라집니다.

 


3. 문제해결 2) 각 Item의 데이터 클래스의 고유값에 해당하는 필드 추가

Adapter가 관리하는 데이터에 해당하는 데이터 클래스의 각 Item을 식별할 수 있는 필드값을 멤버변수로 가지고 있어야 합니다. 

4. 문제해결 3) Adapter의 getItemId() 재정의

    @Override
    public long getItemId(int position)
    {
        return contentItems.get(position).getContentSequence();
    }

▼ 다음과 같이 Adapter의 getItemId() 함수를 재정의하여 인자로 넘어오는 위치에 해당하는 Item의 고유값을 return 해주도록 재정의합니다. 

 

반응형