[안드로이드] RecyclerView와 ListView
개발을 하다 목록을 구현해야할 경우가 있었다.
맨처음 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 차이)