개요
안드로이드 앱에서 목록을 표시할 때 사용하는 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부터 따라가 보면
- myDataset 변수에 명언을 List로 리턴받습니다.
- recyclerView 변수로 recycler_view 뷰를 가리킵니다.
- recyclerView의 adapter 클래스를 구현한 ItemAdapter 클래스를 할당합니다.
- 명언 List가 10개로 정해져 있으므로 setHasFixedSize를 true로 설정하여 성능 향상을 꾀합니다.
Data와 Model은 복잡할 것이 없습니다. 결국 string resource의 ID를 List로 받기 위한 구조입니다.
- Model에서는 Int형 val을 갖는, Affirmation이라는 data class를 정의하고
- Datasource에서는 Affirmation형 데이터를 List로 return하는 함수를 가진 class를 정의합니다.
- 이걸 MainActivity에서 myDataset에 가져다 씁니다.
제일 복잡한 것이 ItemAdapter 클래스입니다.
RecyclerView는 이 Adapter를 통해서 Datastore에 있는 데이터를 ViewHolder에 바인딩하고, LayoutManager를 통해 화면에 표현합니다.
RecyclerView.adapter는 각 목록을 표시하기 위해서
- onCreateViewHolder를 통해 ViewHolder class로부터 ItemViewHolder를 생성합니다. 이 때, 위에서 만들어 둔 list_item.xml 레이아웃 형태로 생성합니다.
- onBindViewHolder를 통해 앞서 생성된 ItemViewHolder에 표시할 데이터를 집어넣습니다.
- 그리고 getItemCount를 override해야 하는데, 데이터의 개수를 리턴하면 됩니다.