혹시 RecyclerView를 사용하면서 RecyclerView의 데이터 삭제 또는 추가 과정에서

RecyclerView가 깜빡이는 현상 때문에 고생하셨나요??

 

 

 

RecyclerView 깜빡이는 현상에 대하여 알아봅시다!

 

 

 

[Android] Kotlin RecyclerView 알아보기

이름에서 알 수 있듯이 RecyclerView는 이러한 개별 요소를 재활용합니다. 항목이 스크롤되어 화면에서 벗어나더라도 RecyclerView는 뷰를 제거하지 않습니다. 대신 RecyclerView는 화면에서 스크롤된 새

salmonpack.tistory.com

 


깜빡이는 현상?

 

 

저는 RecyclerView를 사용하면서 해당 데이터 추가 또는 삭제 시 RecyclerView의 데이터를 갱신 시켜주시 위해

notifyDataSetChange() 메소드를 자주 사용했습니다.

 

notifyDataSetChanged() 메서드 실행 후 어떤 동작이 실행될까요?

 

 

 

사실 저는 지금까지 아무생각 없이 사용했습니다.

(무조건 공식처럼 외웠습니다.)

데이터 갱신 = notifyDataSetChanged()

 

 

notifyDataSetChanged()는 결과적으로 RecyclerView의 모든 자식 뷰들을 다시 그려 생성합니다.

전체적으로 onBindViewHolder()를 호출하여 자식 뷰를 갱신시키기 때문에 순간적으로 깜빡이는 현상이 

나타날 수 있습니다.

 

RecyclerView의 깜빡이는 현상을 개선시키려면

onBindViewHolder()의 호출을 최소화해야 합니다.


setHasStablelds

 

RecyclerView Adapter의 메소드중 setHasStableds() 메서드가 존재합니다.

setHasStableds(true)를 사용하여 RecyclerView의 각각 아이템 값의 position을 지정된 Id 값으로 저장합니다.

(setHasStableds 사용 시 getItemId() 메서드를 반드시 정의해줘야 합니다.)

 

class RecyclerViewAdapter(
    private val list: MutableList<String>
): RecyclerView.Adapter<RecyclerViewAdapter.RecyclerViewHolder>() {

    private var itemLists: MutableList<String> = list

    init {
        setHasStableIds(true)
    }

    override fun getItemId(position: Int): Long {
        return position.toLong()
    }
    
    ...
    
}

 

위와 같이 각각 아이템을 RecyclerView의 position이 아닌 Id값으로 저장하여

onBindViewHolder()의 과도한 호출을 최소화 할 수 있습니다.

 

 

setHasStableIDs(true) in RecyclerView

I am new to android and got stuck when I click on an item in RecyclerView where the data set gets changed and position doesn't match with the ID in SQLite.I know we can get unique ID by using '

stackoverflow.com

 

 


상황에 맞는 데이터 변경 메소드 호출

 

 

데이터 갱신에 대한 메소드가 notifyDataSetChaged 하나뿐일까요??

 

 

AndroidStudoi에서 notifyDataSetChanged 메서드를 확인해보면

notifyDataSetChanged 외 다른 메서드들도 존재한다는 걸 알려주고 있습니다.

 

 

변경 : notifyItemChanged, notifyItemRangeChanged
추가 : notifyItemInserted, notifyItemRangeInserted
삭제 : notifyItemRemoved, notifyItemRangeRemoved
이동 : notifyItemMoved

 

notifyDataSetChanged는 모든 데이터를 변경합니다.

하지만 위와 같이 다른 메서드들을 사용한다면

불필요한 데이터 갱신을 하지 않고 필요한 데이터들만 갱신시켜주기 때문에

데이터 변경사항에 맞는 함수를 골라 사용한다면 퍼포먼스의 효율이 좋아질 것 같습니다.

 

 

notifyItemMoved() , notifyItemRemoved() 를 활용한 예제는 아래를 참고 해주세요!

 

[Android] RecyclerView Drag&Drop/Swipe 기능 구현(ItemTouchHelper)

짜잔! 간단하게 구현한 결과 화면부터 감상하시죠 via GIPHY 자 오늘은 RecyclerView의 Drag&Drop / Swipe 기능을 알아보겠습니다. RecyclerView에 대한 내용은 아래의 내용을 참고해주세요! [Android] Kotlin Rec..

salmonpack.tistory.com

 

 


여기까지 저의 긴 글을 읽어주셔서 감사합니다.

제가 습관적으로 코딩을 하는 그날까지 습관적으로 코딩을 하기 위해 글 작성을 꾸준하게 하겠습니다.

  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기