개발/Android

[안드로이드] RecyclerView와 ListView

Eun 2021. 5. 10. 00:29

개발을 하다 목록을 구현해야할 경우가 있었다.

맨처음 ListView로 구현했다가 RecyclerView가 더 좋다고하여 구현방법을 바꿨는데, 무엇이 더 좋고 어떤 다른점이 있는지 정리해보고자 한다.

 

RecyclerView

ListView의 기능을 보완하기 위해서 만들어진 뷰이다. 

가장 큰 특징이 아래 두 가지이다.

 

 

1. LayoutManager

LayoutManager는 아이템의 배치를 담당하고 가로, 세로, 그리드, 지그재그 방향을 모두 지원을 하여 다양한 커스터마이징할 수 있는 매니저이다. 반면 ListView는 세로 방향만 지원한다.

 

2. ViewHolder

RecyclerView는 ViewHolder 패턴을 구현해서 뷰 바인딩을 한 번만 해주고, 이후에 아이템을 생성할 때 바인딩 된 뷰 객체를 재활용한다는 장점이 있다. 반면 ListView는 아이템을 생성할 때마다 뷰 바인딩을 계속해서 성능저하가 일어난다. 

 

3. 아이템 애니메이션 적용

Item에 대한 뷰의 변형이나 애니메이션할 수 있는 개념이 추가되었다.

RecyclerView의 주요 클래스

- ViewHolder : 재활용 View에 대한 모든 서브 뷰를 보유

- LayoutManager : 아이템의 항목을 배치

- Adapter : 기존의 ListView에서 사용하는 Adapter와 같은 개념으로 데이터와 아이템에 대한 View생성

- ItemAnimation : 아이템 항목이 추가, 제거되거나 정렬될 때 애니메이션 처리

- ItemDecoration : 아이템 항목에서 서브뷰에 대한 처리

- Click Detection : 리사이클러 뷰의 터치 이벤트

 

ViewHolder

  • 각각의 뷰를 보관하는 Holder 객체
  • 아이템 뷰를 재활용하기 위해 요소 저장 -> 뷰 바인딩 한번만 하고 바인딩 된 객체를 가져다 씀

LayoutManager

  • 아이템의 배치를 담당
  • LinearLayoutManager : 가로 또는 세로 스크롤
  • GridLayoutManager : 그리드 형식의 목록
  • StaggeredGridLayoutManager : 지그재그형의 그리드 형식 목록

Adapter

  • 데이터와 아이템에 대한 view 생성
  • onCreateViewHolder(ViewGroup parent, int viewType) : 뷰 홀더를 생성하고 뷰를 붙여주는 부분
  • onBindViewHolder(ListItemViewHolder holder, int position) : 재활용 되는 뷰가 호출하여 실행되는 메소드, 뷰 홀더를 전달하고 어탭터는 position의 데이터를 결합한다.
  • getItemCount() : 데이터의 개수 반환

리스트 뷰가 사용했던 getView()는 배번 호출되면서 null처리를 해주어야했다면, onCreateViewHolder는 새롭게 생성될 때만 호출된다.

 

ItemAnimation

  • 리스트뷰에는 없던 아이템이 추가/삭제될 때 애니메이션을 적용할 수 있다.
  • DefaultItemAnimator가 제공되므로 커스터마이즈가 필요없이 사용가능하다.
  • notifyItemChainged(int position), notifyItemInserted(int position), norifyItemRemoved(int position)을 통해 애니메이션 발생

ItemDecoration

  • RecyclerView의 아이템들을 꾸미는 역할
  • 아이템이나 그룹들 간의 구분자(divider)을 설정하는 것이 유용하게 사용된다.
  • RecyclerView.ItemDecoration 클래스를 통해 divider를 원하는 아이템에 추가 -> 동적 데코레이팅이 가능해짐

Click Detection

  • 리스트뷰는 AdapterView.OnItemClickListener를 이용해서 클릭을 감지할 수 있었으나 리사이클러뷰는 기능이 내장되어 있지 않음
  • 리사이클러뷰는 ViewHolderd에서 onClickListener로 직접 구현하여 처리함

리사이클러뷰는 리스트 뷰에 비해 구현이 조금 어렵지만 다양한 커스터마이징에 중점을 두고 있다. 

다음 포스팅은 이러한 리사이클러뷰를 직접 구현해보도록 할 것이다.


참고

1. RecyclerView란? (RecyclerView와 ListView 차이)

 

2. RecyclerView의 특징과 ListView와의 차이점