Android

[Android] RecyclerView를 update하는 메소드

도우 2024. 2. 28. 12:49
반응형

요약

전체적으로 업데이트

notifyDataSetChanged()

아이템 내용 변경

notifyItemChanged(int position)
notifyItemChanged(int position, Object payload)
notifyItemRangeChanged(int positionStart, int itemCount)
notifyItemRangeChanged(int positionStart, int itemCount, Object payload)

아이템 추가

notifyItemInserted(int position)
notifyItemRangeInserted(int positionStart, int itemCount)

아이템 이동

notifyItemMoved(int fromPosition, int toPosition)

아이템 삭제

notifyItemRemoved(int position)
notifyItemRangeRemoved(int positionStart, int itemCount)

 

 

 

기본 업데이트 메소드

  1. notifyDataSetChanged() 
    - 데이터 세트 전체가 변경되었을 때 호출
    - 어댑터에게 데이터 세트가 완전히 변경되었으니 전체 목록을 업데이트하라고 알림
    => 리스트의 크기와 아이템이 둘 다 변경되는 경우에 사용하는 것이 좋음

    장점 : 구현이 간단함, 데이터 세트의 변경점을 추적할 필요가 없다
    단점 : 성능 저하, 변경 사항의 세부 사항을 알 수 없음

    - 성능적인 측면에서 아래의 상황에 맞게 사용하는 것이 적절함


  2. notifyItemChanged(int position) 
    - 특정 위치의 아이템이 변경되었을 때 호출 / 해당 위치의 아이템만 업데이트, 변경된 부분만 다시 렌더링
    - 단일 아이템 변경

    장점 : 단일 아이템의 변경만 처리하기 때문에 notifyDataSetChanged() 보다 효율적
    단점 : 변경된 아이템의 위치를 정확하게 알고 있어야 함

    - 단일 아이템 변경시 효율적 / ex) 목록의 아이템을 클릭하여 상세 정보를 업데이트 한 경우 등 

  3. notifyItemChanged( int position, @Nullable object payload )
    - position 선택적 페이로드 객체를 사용하여 항목이 변경되었음을 등록된 모든 관찰자에 알린다.
    - 아이템의 일부분만 업데이트되어야 할 때 유용
    - 기본적으로 2번과 동일하며 단일 아이템 변경

    - 장점 : payload를 통해 어떤 부분이 변경되었는지 세밀하게 지정할 수 있다. ( 불필요한 뷰 재바인딩 방지 )


  4. notifyItemRangedChanged ( int positionStart, int itemCount )
    - itemCount 위치에서 시작하는 항목이 positionStart 변경 되었음을 등록된 관찰자에게 알린다.
    - 연속된 여러 아이템이 변경되었을 때 사용한다. (범위를 지정하여 여러 아이템을 한 번에 업데이트)
    - 연속된 여러 아이템 변경

    - 장점 : 단일 아이템을 업데이트하는 것 보다 효율적
    - 단점 : 범위 내의 모든 아이템이 재바인딩되므로, 실제 변경된 아이템 보다 많은 리소스 소모 가능성

  5. notifyItemRangeChanged( int positionStart, int itemCount, @Nullable object payload )
    - itemCount 위치에서 시작하는 항목이 positionStart 변경되었음을 등록된 관찰자에게 알린다.
    - 기본적으로 4번과 동일 
    - 범위 내의 아이템들 중 일부 속성만 변경되었을 경우 유용
    - 연속된 여러 아이템 변경

    - 장점 : payload를 통해 변경된 부분만 세밀하게 업데이트 하여 성능 향상됨

  6. notifyItemInserted(int position) 
    - 특정 위치에 아이템이 삽입되었을 때 호출 / 이후 모든 아이템은 한 칸씩 밀린다
    - 단일 아이템 삽입

    - 장점 : 정확한 위치 업데이트로 성능이 향상 / 삽입 애니메이션을 자연스럽게 표현할 수 있다.
    - 단점 : 삽입될 아이템의 정확한 위치를 알아야 한다.

    - position은 0부터 시작하니 주의하자


  7. notifyItemRangedInserted ( int positionStart, int itemCount )
    - itemCount 현재 반영된 항목이 positionStart에 새로 삽입되었음을 등록된 관찰자에게 알림
    - 지정된 위치로부터 시작하여 여러 아이템이 삽입될 때 사용
    - 기본적으로 6번과 동일하지만 여러 아이템을 한 번에 삽입

    - 장점 : 6번의 단일 삽입보다 효율적


  8. notifyItemRemoved(int position)
    - 특정 위치의 아이템이 제거되었을 때 호출 / 이후 모든 아이템은 한 칸씩 당겨짐
    - 단일 아이템 제거

    - 장점 : 정확한 위치 업데이트로 성능 향상 / 제거 애니메이션 자연스럽게 표현 가능
    - 단점 : 제거될 아이템의 위치를 정확하게 알아야 함

    - 삽입과 마찬가지로 position은 0부터 시작하니 주의하자


  9. notifyItemRangeRemoved ( int positionStart, int itemCount)
    - itemCount 이전에 위치했던 항목이 positionStart 데이터 세트에서 제거되었음을 관찰자에게 알림
    - 지정된 위치로부터 시작하여 여러 아이템이 제거될 때 유용
    - 기본적으롤 8번과 동일하지만 여러 아이템을 한 번에 제거

    - 장점 : 단일 제거보다 효율적


  10. notifyItemMoved(int fromPosition, int toPosition) 
    - 아이템이 리스트 내의 한 위치에서 다른 위치로 이동했을 때 호출된다.

    - 장점 : 이동된 아이템의 정확한 시작 위치와 종료 위치를 알려주므로 성능이 향상된다. 
    - 단점 : 시작 위치와 종료 위치를 알아야 한다

 

▼payload란?
https://ehdnsdlek.tistory.com/19

 

▼공식 문서 참고

 

RecyclerView.Adapter  |  Android Developers

androidx.appsearch.builtintypes.properties

developer.android.com

 

반응형