RecyclerView, ListView에 대한 개념을 알아보는 게 아닌 둘의 차이를 통해 어떤 걸 쓰는게 효율적인지 알아보고자 한다.
(물론 맨날 리사이클러만 쓰지만)
Cruicial Differences
1. ViewHolder
- 뷰홀더 패턴은 우리가 리스트를 스무스하게 스크롤할 수 있게 해준다.
- 목록 행 뷰 참조를 저장함으로 findViewById()메서드 호출은 전체 데이터 셋 혹은 각 bind view에서가 아니라 전체에서 딱 두번만 발생한다.
- RecyclerView의 Adapter는 뷰홀더 패턴을 강제로 사용하게 한다.
- (layout inflating and finding view)와 같은 creating part와 뷰를 뷰 업데이트는 onCreateViewHolder()와 onBindViewHolder()의 두가지 메서드로 나뉜다.
- 반면, ListView의 경우, 기본적으로 이런 종류의 기능을 제공하지 않음으로 getView() 메서드 내부에 ViewHolder 패턴을 구현하지 않으면 목록에서 비효율적인 스크롤이 된다.
2. LayoutManager
- LayoutManager는 행 뷰에 대한 책임을 갖는다. 이로 인해, RecyclerView는 행 뷰에 대한 위치 지정을 생각할 필요가 없다. 뷰를 표시하는 방법과 목록을 스크롤하는 방법을 정해준다.
- 잘 알다시피, LayoutManager로 리스트를 vertical or horizontal하게 스크롤할지를 정한다. (그리드는 GridLayoutManager가 있다)
- ListView? 우린 오직 vertical-scroll만 만들수 있었고, 그래서 이건 그닥 유연하지 못하다. 그리드를 하고싶다면 GridView를 했어야 했다.
3. ItemDecoration
- 사용자 지정 항목을 만들려는 경우 구현하는 것이 가능하다. ItemDecoration 클래스를 extend하고 구현하면 된다. 간단하다.
- RecyclerView 리스트에는 기본적으로 행 사이 구분선이 없으며 Material 디자인 지침과 일치한다.
- 그러나, 추가하고싶다면? DividerItemDecoration을 사용하면 된다.
- ListView라면? 우리가 스스로 방법을 찾아내야 한다... ItemDecoration과 같은 helper class는 ListView에 없다.
4. ItemAnimator
- 이름에서 예상 가능 하듯, 목록 모양 및 사라짐, 특정보기 추가 혹은 제거 등과 같은 뷰에 대한 애니메이션 처리를 한다.
- 기본적으로 RecyclerView의 리스트 애니메이션은 훌륭하다. 당연하게도 우리 스스로 커스텀도 가능하고 쉽다. SimpleItemAnimator클래스를 extend하고 우리가 필요한 걸 구현하면 된다.
- ListView에서의 애니메이션 추가는 고통일뿐이다. 우리 스스로 찾아야 하며 좋을게 하나 없다.
5. Notifying Adapter
- RecyclerView의 어댑터에는 좋은 notifier들이 있다. notifyDataSetChanged()를 안 써본 사람이 없을 정도다. 특정 리스트의 요소에 대해서 notifyItemInserted(), notifyItemRemoved() 혹은 심지어 nofityItemChanged()도 있고 더 있다..
- ListView()에서도 notifyDataSetChanged()가 있다. 그러나 개별 아이템에 대한 notify는 제공하지 않고 개별적으로 개발자가 만들 수 있겠다.
Conclusion
비교를 하다보니 마치 리스트뷰는 쓰레기고 리사이클러뷰만 써! 이런 느낌이다..🥺
아니다. 정확히 이야기하면 각자의 장단점이 있는거고 적절하게 선택해서 쓰면 된다.
ListView는 API1부터 제공되던 기능이다. 오랜 시간 제공 되어 왔지만 사용자의 요구사항이 점차 달라지고 복잡해지며 어려워져왔다. 그에 맞춰 다양하게 대응할 수 있는 리스트가 필요하다. 물론, 재사용성을 고려하는 게 첫 번째이기도 하다. 디자인적인 측면에서도 RecyclerView가 훨씬 우세했다.
Ref