본문 바로가기
Android

[Android] RecyclerView의 notifyItemChanged 사용 시 발생하는 깜빡임 문제 해결 방안

by quessr 2024. 4. 22.

 

RecyclerView에서 notifyDataSetChanged 사용해 어댑터 아이템들을 업데이트할 발생하는 성능 문제를, 특정 아이템만을 업데이트하는 notifyItemChanged 통해 해결할 있었다. 

그러나 이 방식을 적용하더라도, 엘레베이터의 층수가 1초마다 변하면서 UI를 업데이트할 때 깜빡임과 버벅거림 문제가 계속 발생했다.

이 문제의 원인을 조사해보니, Android의 RecyclerView를 위한 SimpleItemAnimator의 기본 애니메이션 효과가 원인임을 알아냈다.

SimpleItemAnimator는 RecyclerView 아이템 애니메이션을 구현하기 위한 추상 기본 클래스로, RecyclerView.ItemAnimator를 확장한다.

공식 문서의  RecyclerView.ItemAnimator animateChange 부분을 살펴보면, 어댑터 항목의 notifyItemChanged 호출을 받은 경우, 즉 어댑터 항목이 변경되어 레이아웃이 업데이트될 때 notifyItemChanged 호출을 받은 경우 RecyclerView 의해 SimpleItemAnimator 호출되어 기본 아이템 변화 애니메이션이 적용됨을 알수 있다.

RecyclerView에 의해 SimpleItemAnimator이 호출되어 기본 아이템 변화 애니메이션이 적용됨을 알수 있다.

따라서, 엘레베이터 층수 변화와 같이 빈번한 데이터 업데이트가 발생하는 상황에서 notifyItemChanged 호출하면 기본 설정된 애니메이션 효과로 인해 UI 깜빡이거나 버벅일 있다는 것을 알게 되었다

 

문제 해결을 위해 RecyclerView 어댑터 연결 코드 부근에 다음과 같은 코드를 추가했다.

        RecyclerView.ItemAnimator animator = binding.rvMenuCtrl.getItemAnimator();
        if (animator instanceof SimpleItemAnimator) {
            ((SimpleItemAnimator) animator).setSupportsChangeAnimations(false);
        }

 

 

setSupportsChangeAnimations(false)를 설정함으로써, 아이템 변경 시 애니메이션 없이 즉각적으로 뷰가 갱신되도록 하여 애니메이션을 비활성화함으로써 깜빡임이나 버벅거림 문제 없이 더 빠른 데이터 반영이 가능해졌다.

이는 UI가 빠르게 갱신되어야 하는 상황, 실시간으로 정보가 업데이트되어야 하는 애플리케이션에 특히 유용히다.

 

반면, setSupportsChangeAnimations 메소드를 true로 설정하면 아이템 변경 시 시각적인 애니메이션 효과가 적용되어 사용자에게 더 풍부한 시각적 경험을 제공할 수 있다.

이는 사용자의 시각적 만족도를 높이는 데 기여할 수 있으며, 시각적 매력이 중요한 애플리케이션에 적합하다.

 

따라서, setSupportsChangeAnimations 메소드의 사용 여부는 애플리케이션의 특성과 사용자 요구를 고려하여 결정해야 힌.

지금과 같은 빠른 데이터 업데이트가 필요한 경우 애니메이션을 비활성화하여 사용자 경험을 개선할 있고, 시각적 매력을 중시하는 경우에는 애니메이션을 활성화하여 동적인 인터페이스를 제공할 있다.

올바른 설정을 통해 애플리케이션의 사용성과 만족도를 높이는 것이 중요하다.

 


참고 : https://developer.android.com/reference/androidx/recyclerview/widget/RecyclerView.ItemAnimator#animateChange(androidx.recyclerview.widget.RecyclerView.ViewHolder,androidx.recyclerview.widget.RecyclerView.ViewHolder,androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemHolderInfo,androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemHolderInfo) 

 

RecyclerView.ItemAnimator  |  Android Developers

androidx.appsearch.builtintypes.properties

developer.android.com

https://developer.android.com/reference/androidx/recyclerview/widget/SimpleItemAnimator 

 

SimpleItemAnimator  |  Android Developers

androidx.appsearch.builtintypes.properties

developer.android.com