ListView가 널리 쓰일때부터 RecyclerView, 그리고 지금은 DiffUtil을 이용한 ListAdapter를 사용하기 까지! 수 년간 안드로이드를 개발해왔는데, RecyclerView에 대해서 계속 당하기만 한 기억뿐이다. 잘몰라서 그렇다. 그래서 이번에 RecyclerView에대해서 공부 할 거리를 찾아보다 발견한 짧은 글을 간단히 번역해 보기로 했다.
원문: proandroiddev.com/recyclerview-pro-tips-part-1-8a291594bafc
1. 런타임에 RecyclerView 내의 아이템 크기가 변하지 않는다면 setHasFixedSize(true)를 사용해라.
RecyclerView 내의 아이템의 높이가 모두 균일하다면 RecyclerView.setHasFixedSize(true) 를 사용하는 것이 좋다. 이렇게 하면, 데이터가 업데이트 되어도 RecyclerView가 레이아웃을 요청하지 않고 뷰 스스로 invalidate 된다.
2. 아이템 클릭 리스너를 onCreateViewHolder(...)에 등록해라
리스트 내의 아이템은 삭제, 추가 등을 통해 어댑터 상에서 언제든 위치가 바뀔수있고, 재배치되지 않는다. 그래서 뷰 홀더가 바운드되었을때 위치가 2였다면, 나중에 유저가 클릭했을때 위치가 5가되어있을 수도 있다!
아이템 클릭 리스너를 onCreateViewHolder에 등록 할 경우 유저가 리스트내의 어떤 아이템을 클릭하던, 뷰 홀더는 viewHolder.getAdapterPosition()을 통해 클릭이 일어난 Adapter 포지션을 반환한다.
3. 다른 뷰 타입을 가질경우, getItemViewType()에서 레이아웃 아이디를 반환해라.
getItemViewType에서 position에 따라서 Enum을 주고, onCreateViewHolder에서는 그 Enum값에 따라서 다른 레이아웃을 inflate하는 경우가 있는데, 그냥 getItemViewType()에 레이아웃 아이디를 반환해서 onCreateViewHolder에 그래도 사용하면 보일러 플레이트 코드를 줄일 수 있다.
4. RecyclerView에 새로운 아이템을 추가할때 DiffUtil을 사용하라.
리스트 내의 아이템이 변할때, notifyDataSetChanged()를 사용하게 되면 불필요한 렌더링을 일으키게 되어 앱 성능에 좋지 않은 영향을 줄 수 있다.
DiffUtil을 전, 후 두 개의 리스트를 비교하고 바뀌어야할 부분만 업데이트 하게 해주는 유틸리티 클래스이다.
원문이 2017년에 쓰여서 그 당시에는 없었지만, DiffUtil 클래스를 더욱 편하게 쓸수 있게 해주는 ListAdapter에 대해서 알아보면 좋다.
'프로그래밍 > Android' 카테고리의 다른 글
[안드로이드] Nested RecyclerView 구현시 스크롤 문제 해결하기 (0) | 2021.03.08 |
---|---|
[안드로이드] 에뮬레이터 감지 하는 법 (Detecting Emulator Device) (1) | 2021.03.08 |
[안드로이드] 예제로 알아보는 바인드된 서비스 (Bound Service) (0) | 2021.01.18 |
[안드로이드] 패키지명(Package name)으로 앱 실행하기 (0) | 2021.01.18 |
[안드로이드] Firebase Crashlytics 연동방법 (0) | 2021.01.15 |