[Android] RecyclerView의 NotifyXXX 함수들
- 안드로이드의 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과 관련된 내용을 정리할 예정이다.