Software Engineering/Android

[Android][Kotlin] RecyclerView로 목록 표시하기

iseop 2021. 12. 31. 14:33   인쇄용 버전

개요

안드로이드 앱에서 목록을 표시할 때 사용하는 RecyclerView라는 뷰에 대해서 나름대로 정리해 보았습니다.

RecyclerView는 ListView와 다르게, 화면에 표시되지 않는 View를 재사용해서 더 효율적이라고 합니다.

 

정리한 내용은 Android Developers 웹사이트의 Android Basics in Kotlin 강의 코스에서 제공되는 "Affirmation"이라는 예제 앱에서 나왔습니다.

 

Android Basics in Kotlin course  |  Android Developers

Learn Android Basics in Kotlin.

developer.android.com

완성된 앱을 실행하면 아래처럼 3열 격자 모양의 카드가 배열됩니다.

 

메인 레이아웃 파일

activity_main.xml에는 FrameLayout 내에 RecyclerView 하나가 배치되어 있습니다.

이 RecyclerView의 LayoutManager는 GridLayoutManager이고, SpanCount는 3, Orientation은 vertical입니다.

즉 3열 수직 스크롤을 표현합니다. 이외에 기본적인 LinearLayoutManager도 있습니다.

 

ViewHolder 레이아웃 파일

list_item.xml에는 각각의 명언 카드를 위한 MaterialCardView가 정의되어 있습니다.

하나의 MaterialCardView에는 아래처럼 이미지와 텍스트가 수직으로 쌓인 모양으로 배치됩니다.

 

Adapter 구현

복잡해 보이지만 MainActivity부터 따라가 보면

  1. myDataset 변수에 명언을 List로 리턴받습니다.
  2. recyclerView 변수로 recycler_view 뷰를 가리킵니다.
  3. recyclerView의 adapter 클래스를 구현한 ItemAdapter 클래스를 할당합니다.
  4. 명언 List가 10개로 정해져 있으므로 setHasFixedSize를 true로 설정하여 성능 향상을 꾀합니다.

 

Data와 Model은 복잡할 것이 없습니다. 결국 string resource의 ID를 List로 받기 위한 구조입니다.

  1. Model에서는 Int형 val을 갖는, Affirmation이라는 data class를 정의하고
  2. Datasource에서는 Affirmation형 데이터를 List로 return하는 함수를 가진 class를 정의합니다.
  3. 이걸 MainActivity에서 myDataset에 가져다 씁니다.

 

제일 복잡한 것이 ItemAdapter 클래스입니다.

RecyclerView는 이 Adapter를 통해서 Datastore에 있는 데이터를 ViewHolder에 바인딩하고, LayoutManager를 통해 화면에 표현합니다.

 

RecyclerView.adapter는 각 목록을 표시하기 위해서

  1. onCreateViewHolder를 통해 ViewHolder class로부터 ItemViewHolder를 생성합니다. 이 때, 위에서 만들어 둔 list_item.xml 레이아웃 형태로 생성합니다.
  2. onBindViewHolder를 통해 앞서 생성된 ItemViewHolder에 표시할 데이터를 집어넣습니다.
  3. 그리고 getItemCount를 override해야 하는데, 데이터의 개수를 리턴하면 됩니다.