[Android] ListAdapter

김민주·2022년 11월 27일
0

Android

목록 보기
15/21

ListAdapter

Adapter는 데이터를 받아서 레이아웃에 직접 연결해주는 클래스이다.
ListAdapter는 DiffUtil을 이용하여 리스트를 업데이트하는 어댑터이다.

  • getCurrentList() : 현재 리스트를 반환한다.
  • onCurrentListChanged() : 리스트가 업데이트 되었을 때 실행할 콜백을 지정할 수 있다.
  • submitList(List) : 리스트 데이터를 교체할 때 사용한다.

notifyItem

리사이클러뷰 어댑터가 제공하는 노티파이아이템 메소드

  • notifySetChanged : 리사이클러뷰 전체 업데이트(리스트 크기와 아이템 모두 변경 시)
  • notifyItemChanged : 특정 아이템만 변경 시
  • notifyItemRangeChanged : 연속된 아이템들 변경 시
  • notifyItemInserted : 특정 아이템 삽입 시
  • notifyItemRangeInserted : 연속된 아이템들 삽입 시
  • notifyItemRemoved : 특정 아이템 삭제 시
  • notifyItemRangeRemoved : 연속된 아이템들 삭제 시
  • notifyItemMoved : 특정 아이템 위치 이동 시

DiffUtil

변한 부분의 차이를 계산해서 갱신결과를 반환해주는 클래스이다.
(바뀐 부분을 별로 없다면 전체를 업데이트하는 것은 비효율적이기때문)

  • difference 알고리즘 -> 빅오 : O(변한 항목의 개수 + 스크립트길이의 제곱)
  • 리스트가 커질수록 시간복잡도가 높아 BackgroundThread에서의 처리를 권장한다.
  • 추상클래스인 DiffUtil.Callback 을 구현해야 한다.
    - getOldListSize() : 현 리스트 size
    - getNewListSize() : 갱신 리스트 size
    - areItemsTheSame(int oldItemPosition, int newItemPosition) : 두 아이템의 id가 같은지
    - areContentsTheSame(int oldItemPosition, int newItemPosition) : 두 아이템을 equals 비교
    - getChangePayload(int oldItemPosition, int newItemPosition) : areItemTheSame()이 true, areContentsTheSame()이 false일 때 변경 내용의 페이로드 가져옴

AsyncListDiffer

DiffUtil에 대해 자체적으로 스레드 처리를 해주는 클래스이다.


ListApapter

AsyncListDiffer를 더 쓰기 편하게 랩핑한 클래스이다.

  • RecyclerViewAdapter 가 ListApapter 를 상속하게 한다.
  • 초기화 시 DiffUtil 콜백 객체를 넘겨준다.
  • submitList() 함수로 전체를 전달하면 어댑터가 Background Thread를 사용해




참고
https://www.inflearn.com/course/%EC%95%8C%EA%B8%B0%EC%89%AC%EC%9A%B4-modern-android/unit/112153 ,
https://velog.io/@24hyunji/AndroidKotlin-RecyclerView%EC%97%90%EC%84%9C-ListAdapter-DiffUtil-%EC%82%AC%EC%9A%A9%ED%95%B4%EB%B3%B4%EA%B8%B0

profile
𝐃𝐨𝐧'𝐭 𝐛𝐞 𝐚 𝐩𝐫𝐨𝐜𝐫𝐚𝐬𝐭𝐢𝐧𝐚𝐭𝐨𝐫💫

0개의 댓글