• 안드로이드의 RecyclerView 어댑터에서 항목이 변경되는 순간 이를 알려주는 메소드들이 있다.
  • 효율적으로 사용하기 위해서 각 메소드들의 특징을 알아야 한다.

Methods

  • 데이터 변경 이벤트에는 '아이템 변경’과 '구조 변경’의 두 가지가 존재한다.
  • 아이템 변경(Item change) : 단일 항목의 데이터가 업데이트되었지만 위치는 변경되지 않은 경우
  • 구조 변경(Structural change) : 아이템이 Data Set 내에서 삽입, 이동된 경우

[notifyDataSetChanged]

1
void notifyDataSetChanged()
  • 반환값이 없다.
  • Data set이 변경된 경우, 그 내용을 등록된 옵저버에 알려준다.
  • 해당 이벤트는 변경된 Data Set에 대해 규명하지 않으므로 옵저버에게 기존의 모든 아이템과 구조가 유효하지 않을 것이라고 알려준다. LayoutManager는 모든 자료를 다시 바인딩하고, 모든 View를 다시 레이아웃하게 된다.
  • 가능한 이 이벤트를 사용하는 것보다 해당 상황에 더 적합한 구체적인 이벤트를 사용하는 것이 성능 측면에서 좋다.
  • 사용이 편리하지만, 최후의 수단으로 사용하는 게 좋다.

[nofityItemChanged]

1
void notifyItemChanged(int position, Object payload)
  • position : (필수) 변경된 아이템의 위치
  • payload : (옵션) null 값인 경우, 모든 업데이트로 식별
  • 아이템의 위치가 변경되면 옵저버에게 알려주는 메소드이다. payload 객체를 옵션으로 사용할 수 있다.
  • 구조가 변경되는 이벤트에는 반응하지 않는다.

[notifyItemInserted]

1
void notifyItemInserted(int position)
  • position : (필수) Data Set에 새로 삽입된 아이템의 위치
  • position의 위치에 새로 삽입된 아이템이 있음을 옵저버에게 알려 반영한다.
  • 특정 포지션에 아이템을 삽입하고 싶으면 position 값에 +1을 해야 한다.(3번 위치에 삽입이 되었다면 2+1)
  • 구조가 변경되는 이벤트이며, Data Set의 기존 아이템은 최신의 것으로 간주된다.
  • 위치가 변경될 수는 있지만, rebound 되지는 않는다.

[notifyItemMoved]

1
void notifyItemMoved(int fromPosition, int toPosition)
  • fromPosition : (필수) 아이템의 이전 위치값
  • toPosition : (필수) 아이템의 새로운 위치값
  • fromPosition의 위치값에서 toPosition의 위치값으로 아이템이 이동되었을 때, 옵저버에 알리는 메소드이다.
  • 구조가 변경되는 이벤트이다. 이동되지 않은 기존 아이템은 최신의 것으로 간주된다.

[notifyItemRangeChanged]

1
void notifyItemRangeChanged(int positionStart, int itemCount, Object payload)
  • positionStart : (필수) 변경된 첫 번째 아이템의 위치
  • itemCount : (필수) 변경된 아이템의 갯수
  • payload : (옵션) null 값인 경우, 모든 업데이트로 식별
  • positionStart 위치에서 시작하여 itemCount 갯수만큼 아이템이 변경되었을 때 옵저버에게 알리는 메소드이다.
  • 아이템 변경 이벤트이지 구조 변경 이벤트는 아니다.

Conculsion

notifyXXX 계열의 함수를 사용하는 것보다 DiffUtil을 사용하는 것이 더 효율적이며, 간편한 방법이다. 다음에는 DiffUtil과 관련된 내용을 정리할 예정이다.

Reference