안드로이드/Android

RecyclerView

block_626 2022. 5. 31. 01:02

RecyclerView

RecyclerView는 이미지나 텍스트를 리스트화해서 스크롤하며 볼 수 있게 해주는 컨테이너이다.

 

기존에 사용하던 ListView와 비슷하지만, 정확히는 ListView의 확장판이라고 이야기 할 수 있다.

목록의 뷰는 ViewHolder 로 표현되며 각 ViewHolder 는 View를 사용하여 각 항목을 표시하는 역할을 한다.

ViewHolder 객체는 Adapter에서 관리하며 Adapter는 필요에 따라 ViewHolder를 만들어 onBindViewHoler()

호출함으로써 데이터를 바인딩한다.

 

View를 채울 때 LayoutManger 가 필요한데, LinearLayoutManager 또는 GridLayoutManager 를 쓰거나 직접 구현하여 사용하면 된다.

 

 * ViewHolder를 사용하는 이유? 

 - 맨 처음 화면에 보이는 뷰 객체를 홀딩(기억)하고 있어야 하기 때문에 ViewHolder를 사용한다.

ListView 는 사용자가 스크롤 할 때마다 위에 있던 뷰는 삭제되고, 맨 아래의 뷰는 생성되길 반복하여 cost가 매우 높아지게 되는 반면,

RecyclerView에서는 아이템이 100000개를 넘어가더라도 화면에 보이는 정도의 View만 생성하고, 스크롤 할 때마다 삭제하지 않고 가장 아래의 아이템쪽으로 객체를 이동시켜 재사용하게 된다

 

주요 클래스

Adapter : 아이템에 대한 View 생성
ViewHolder : 재활용 View에 대한 모든 서브 View를 관리
LayoutManager : 아이템 항목 배치
ItemDecoration : 아이템 항목에서 서브뷰에 대한 처리
ItemAnimation : 아이템 항목 애니메이션 처리
 

리사이클러뷰(RecyclerView)를 위한 구성 요소.

"리사이클러뷰(RecyclerView)"는 다른 "리스트 표시를 위한 요소"들이 그러하듯, 데이터 목록을 아이템 단위의 뷰로 구성하여 화면에 표시하기 위해 "어댑터(Adapter)"를 사용합니다.

 

그런데 화면에 표시될 아이템 뷰들을 수직(Vertical) 방향으로, 일렬로 나열하는 리스트뷰와 달리, 리사이클러뷰는 수평(Horizontal) 방향 레이아웃 또는 격자(Grid) 형태의 레이아웃으로도 나타낼 수 있습니다. (물론, 이보다 더 다양하고 복잡한 형태의 레이아웃으로 직접 커스터마이징할 수도 있습니다.) 이를 위해 리사이클러뷰에서는 아이템 뷰가 나열되는 형태를 관리하기 위한 요소를 제공하는데, 이를 "레이아웃매니저(Layout Manager)"라고 부릅니다.

 

마지막으로 레이아웃매니저(LayoutManager)가 제공하는 레이아웃 형태로, 어댑터를 통해 만들어진 각 아이템 뷰는 "뷰홀더(ViewHolder)"객체에 저장되어 화면에 표시되고, 필요에 따라 생성 또는 재활용(Recycle)됩니다.

 

리사이클러뷰의 각 구성 요소가 어떤 구조로 처리되는지는, 아래 그림을 참고하시면 조금 더 이해하기 쉬울 거라 생각합니다.

 

리사이클러뷰(RecyclerView)

리사이클러뷰는 v7 지원 라이브러리(v7 Support Library)에서 제공되는 위젯으로, 앞서 소개한 구성 요소들을 통해, 사용자 데이터를 리스트 형태로 화면에 표시하는 컨테이너 역할을 수행합니다. (android.support.v7.widget.RecyclerView)

 

어댑터(Adpater)

리사이클러뷰에 표시될 아이템 뷰를 생성하는 역할은 어댑터가 담당합니다. 사용자 데이터 리스트로부터 아이템 뷰를 만드는 것, 그것이 바로 어댑터가 하는 역할이죠. (android.support.v7.widget.RecyclerView.Adapter)

 

하지만 앞서도 언급했듯이, 수직(Vertical) 방향으로 아이템을 배치할 수 있는 리스트뷰와 다르게, 리사이클러뷰는 다양한 형태로 아이템을 배치할 수 있죠. 이를 위해, 어댑터에서 아이템 뷰를 생성하기 이전에, 어떤 형태로 배치될 아이템 뷰를 만들 것인지를 결정하는 요소가 제공되는데, 바로 레이아웃매니저(LayoutManager)입니다.

레이아웃매니저(LayoutManager)

레이아웃매니저는 리사이클러뷰가 아이템을 화면에 표시할 때, 아이템 뷰들이 리사이클러뷰 내부에서 배치되는 형태를 관리하는 요소입니다. (android.support.v7.widget.RecyclerView.LayoutManager)

 

안드로이드 SDK에서는 다음과 같은 레이아웃매니저들이 기본으로 제공되고 있으며, 각 레이아웃매니저가 아이템 뷰들을 배치하는 형태는 아래 그림과 같습니다.

 

  • 리니어(LinearLayoutManager) : 수평(Horizontal) 또는 수직(Vertical) 방향, 일렬(Linear)로 아이템 뷰 배치.
  • 그리드(GridLayoutManager) : 바둑판 모양의 격자(Grid) 형태로 아이템 뷰 배치.
  • 스태거드그리드(StaggeredGridLayoutManager) : 엇갈림(Staggered) 격자(Grid) 형태로 아이템 뷰 배치.

 

그리고 레이아웃매니저는 더 이상 화면에 표시되지 않는(no longer visible to the user) 아이템 뷰를 언제 재활용(recycle)할 것인지에 대한 정책도 결정합니다.

뷰홀더(ViewHolder)

뷰홀더(ViewHolder)는 화면에 표시될 아이템 뷰를 저장하는 객체입니다. (android.support.v7.widget.RecyclerView.ViewHolder)

 

어댑터에 의해 관리되는데, 필요에 따라(좀 더 정확히는, 레이아웃매니저의 아이템 뷰 재활용 정책에 따라) 어댑터에서 생성됩니다. 물론, 미리 생성된 뷰홀더 객체가 있는 경우에는 새로 생성하지 않고 이미 만들어져 있는 뷰홀더를 재활용하는데, 이 때는 단순히 데이터가 뷰홀더의 아이템 뷰에 바인딩(Binding)됩니다.

 

워크플로우

리사이클러뷰 기본 사용법 예제 작성을 위한 워크플로우는 아래와 같습니다. 

 

참고로 아래의 예제는, 안드로이드 스튜디오 프로젝트 생성 단계에서 "Basic Activity"를 선택하여 생성된 코드를 기반으로 작성되었습니다.