리사이클러뷰, 어댑터

MSU·2024년 12월 26일

Android

목록 보기
29/36

여러 항목이 있는 리스트를 표현할 때
초기에는 리스트 뷰를 사용했지만 지금은 리사이클러뷰를 사용한다.
리스트 뷰는 가진 항목을 표현하는 뷰를 모두 생성했지만 리사이클러뷰는 모든 뷰를 생성하지 않고 몇개의 뷰만 생성하여 화면에서 벗어난 뷰를 재사용하여 뷰가 삭제되고 생성되는 과정에서 발생하는 비용을 줄일 수 있다.

리사이클러뷰의 내부에 리사이클러 라는 클래스가 있어 화면 밖으로 나간 뷰는 scrapped view로 리바인딩이 필요 없을 경우 그대로 화면에 다시 보여질 수 있고, 리바인딩이 필요한 경우 dirty view로 간주되어 어댑터가 dirty view에 데이터를 리바인딩하여 다시 화면에 보여주면서 view를 재활용할 수 있다.

리사이클러뷰를 구성하는 주요 클래스는 layoutmanager, adpter, viewholder가 있다.
layoutmanager가 뷰를 배치하면서 필요한 몇 번째 포지션의 뷰를 리사이클러뷰에 요청합니다.
리사이클러뷰는 해당 뷰가 재활용할 수 있는 뷰인지 캐시된 뷰를 확인하고 있다면 해당 뷰를 그대로 반환하고 없다면 어댑터에서 바인딩하여 뷰를 반환한다.
이 때 어댑터는 뷰홀더 패턴을 이용하여 뷰와 데이터를 연결하여 뷰를 반환해준다.

리사이클러뷰는 아이템 변경 상황에 따라 notifyItem~() 메서드를 제공하고 있다.
notifyDataSetChanged() 메서드는 아이템 전체 항목을 재구성하기 때문에 notifyItem~() 메서드를 먼저 사용하고 notifyDataSetChanged()는 최후의 수단으로 사용해야 한다.
하지만 모든 상황에 맞추어 notifyItem~() 메서드를 정의하는 것은 번거로운 일이기 때문에 DiffUtil을 사용하여 번거로움을 줄일 수 있다.

DiffUtil 클래스를 사용하면 이전 목록과 현재 목록을 비교하여 업데이트가 필요한 데이터에 대해서만 갱신을 해준다. 특히 AsyncListDiffer를 사용하면 DiffUtil이 수행하는 업데이트 업무를 백그라운드에서 비동기로 수행할 수 있게 해주기 때문에 데이터의 크기가 커서 연산이 길어질 경우 AsyncListDiffer를 사용하면 효율적으로 업데이트를 할 수 있다.

이 AsyncListDiffer를 더 편리하게 사용할 수 있게 제공하는 클래스가 ListAdapter이다. AsyncListDiffer를 포함하고 있기 때문에 AsyncListDiffer 객체를 생성할 필요가 없다.
ListAdapter를 사용하면 어댑터에서 submit()메서드를 바로 호출할 수 있다.

profile
안드로이드공부

0개의 댓글