프로그래밍/Android

[안드로이드] RecyclerView를 잘 사용하기 위한 팁들.

Lou Park 2021. 2. 5. 21:39

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에 대해서 알아보면 좋다.