본문 바로가기

안드로이드

안드로이드 리사이클러뷰(RecyclerView) 개념

안드로이드 앱을 개발하다보면 한 화면에 여러개의 목록을 보여주기 위해 ListView를 사용했지만 현재는 (5.0 롤리팝 이후) RecyclerView로 ListView의 거의 모든 기능 구현이 가능하기 때문에 대부분 RecyclerView를 많이 사용한다. 나또한 개발을 하며 실제 ListView를 사용하는것보다 RecyclerView를 사용하는게 더 좋다고 해서 알아보고 사용해보려 한다. 그럼 어떤 차이점이 있을까???

 

 

기존의 listView는 커스터마이징이 힘들고 구조적인 문제로 인해 성능상 문제도 존재한다고 한다. 근데 정확히 어떻게 성능에 문제가 있는지는 잘 모르겠다... 가장 큰 차이점은 Layout Manager와 View holder 패턴의 의무사용, Item에 대한 뷰의 변형이나 애니메이션 할 수 있는 기능이 추가 되었다고 한다. 리사이클러뷰의 가장 큰 장점은 Flexibility를 가장 큰 장점으로 가지고 있다. 기존의 리스트뷰의 구현의 경우는 아이템들을 수직 방향으로만 나열할 수 있었지만 (수평 고현을 위해서는 상당부분 재 구현이 필요) 수직, 수평 방향의 아이템 나열과 아이템 뷰의 동적 구성을 용이하게 만들어 주며, 이를 런타임에 바꾸게 만들 수도 있다. 다음은 리사이클러뷰를 구현하기 위한 주요 클래스와 해당 클래스의 설명이다.

 

주요 클래스

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

 

출처: https://recipes4dev.tistory.com/154

리사이클러뷰에 표시될 아이템 뷰를 생성하는 역할을 담당하며, 사용자 데이터 리스트로부터 아이템 뷰를 만드는 역할을 담당하며, 다음의 3가지 인터페이스를 구현해야 한다.

 

- onCreateViewHolder(ViewGroup parent, int view Type): 뷰 홀더를 생성하고 뷰를 붙여주는 부분

 

- onBindViewHolder(ListItemViewHolder holder, int position): 재활용되는 뷰가 호출하여 실행되는 메소드로 뷰 홀더를 전달하고 어댑터는 poition 의 데이터를 결합

 

- getItemCount( ) : 데이터의 개수 반환

 

2. LayoutManager: 아이템의 항목을 배치

 

출처: https://recipes4dev.tistory.com/154

레이아웃매니저는 리사이클러뷰가 아이템을 화면에 표시할 때 아이템뷰들이 리사이클러뷰 내부에 배치되는 형태를 관리하는 요소로써 SDK에서 기본으로 제공되는 리니어, 그리드, 스태거드그리드 방식으로 형태를 지정할 수 있다.

 

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

 

출처: https://recipes4dev.tistory.com/154

어댑터에 의해 생성되며 미리 생성된 뷰홀더 객체가 있는 경우에는 새로 생성하지 않고 이미 만들어져 있는 뷰홀더를 재활용하는데 이때 단순히 데이터가 뷰홀더의 아이템 뷰에 바인딩 됨. 한마디로 UI를 수정할때마다 부르는 findViewById()를 뷰홀더 패턴을 이용해 한번만 호출 함으로써 기존 리스트뷰의 성능저하 단점을 해결 가능하다.

 

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

 

5.ItemAnimation: 리사이클러 뷰에서는 RecyclerView.ItemAnimator 클래스를 통해 애니메이션을 핸들링 할 수 있게 되었다. 이 클래스를 통해서 아이템 삽입,삭제,이동에 대한 커스터마이징이 가능하고, 또한 DefaultItemAnimator가 제공되므로 커스터마이즈가 필요 없이 사용할 수도 있다. notifyItemChanged(int position), notifyItemInserted(int position), notifyItemRemoved(int position)을 ItemAnimator을 통해 특정 아이템에 대한 애니메이션을 발생시킬 수 있다. 

 

결국 리사이클러뷰는 모듈화가 되어있으며 앞서 살펴본거와 같이 어댑터, 뷰홀더, 레이아웃 매니저로 볼 수 있다. 개발을 위한 워크플로우는 다음과 같다.

 

리사이클러뷰가 표시될 위치 결정 (MainActivity에 RecyclerView 추가) -> 리사이클러뷰 아이템 배치 형태 결정 (아이템 뷰 화면 설계 및 LayoutManager 선택) -> 아이템 뷰 레아웃 구성 (레이아웃 xml 작성) -> 아템 데데이터 클래스 정의 -> 어댑터 상속 및 구현 (extends RecyclerView.Adapter) -> 뷰홀더 상속 및 구현 (extends RecyclerView.ViewHolder) -> 어댑터 생성 및 지정 (RecyclerView.setAdapter()) -> 레이아웃 매니저 생성 및 지정 (RecyclerView.setLayoutManager()) -> 데이터 추가 및 아이템 표시 (RecyclerView.Adapter.notifyDataSetChange())

 

ppt 이용해서 만들어야 잘 보이겠지만 일단 귀찮아서 글로 쓰기만 해봤다 그럼 다음에는 이 워크플로우에 맞춰서 직접 리사이클러뷰 구현을 해보겠다.