RecyclerView (1)
지난 포스팅에는 ListView, GridView 에 대해 시리즈로 알아보았다.
이번 포스팅에서는 ListView, GridView 의 개선판이라 볼 수 있는 RecyclerView 에 대해 알아보려 한다.
RecyclerView
public class RecyclerView
extends ViewGroup
implements ScrollingView, NestedScrollingChild2, NestedScrollingChild3
java.lang.Object | |||||
↳ | android.view.View | ||||
↳ | android.view.ViewGroup | ||||
↳ | androidx.recyclerview.widget.RecyclerView |
RecyclerView 는 Android 5.0(Lollipop) 버전에서 처음 소개한 widget 으로 ListView 에 유연함(Flexibility)과 성능(Performance)을 더한 개선 버전이다.
Google 에서도 ListView, GridView 레거시로 처리하고 리스트 형식의 UI 를 구성할 때 RecyclerView 를 사용하도록 권장하고 있다.
Different
RecyclerView 가 ListView 와 어떤 차이가 있는지 알아보자.
◼ ViewHoler 패턴의 의무사용
ListView 를 구현할 경우 큰 문제점으로 성능저하가 있다. (리스트 항목이 갱신될 때마다 아이템 뷰 새로 구성)
이를 해결하기 위해 ViewHolder 패턴을 쓸 수 있지만 선택사항 이였다. (즉, 모르는 사람은 안 쓴다는 얘기다.)
RecyclerView 에서는 ViewHolder 패턴을 의무적으로 사용하여 성능저하를 미연에 방지하도록 만들었다.
ViewHolder 관련 상세 설명은 이전 ListView 포스팅을 참조하기 바란다.
[Android/UI] - ListView (3) - ListView 에 image 추가하기
◼ LayoutManager
ListView 에서는 기본적으로 수직 방향의 리스트만 지원한다.
(물론 커스터마이징을 통해 원하는 형태를 구현 할 수 있다.)
RecyclerView 에서는 LayoutManager 를 통해 하단과 같은 타입의 리스트들을 지원한다.
- LinearLayoutManager: 수직, 수평 타입으로 아이템 배치.
- GridLayoutManager: 바둑판 모양의 격자 타입으로 아이템 배치
- StaggeredGridLayoutManager: 아이템 마다 크기가 다른 격자 타입으로 아이템 배치
◼ ItemDecoration
ListView 에서는 ItemView 사이 간격에 대한 설정을 divider 를 통해 설정 했다.
RecyclerView 에서는 ItemDecoration 클래스를 통해 설정이 가능하다.
ListView 대비 다소 복잡하긴 하지만 좀 더 동적인 사용과 커스터마이징이 편해졌다.
◼ ItemAnimator
RecyclerView 에서는 애니메이션 지원을 위해 ItemAnimator 클래스를 제공한다.
ItemAnimator 를 통해 ItemView 의 삽입, 삭제, 이동 시 애니메이션을 커스터마이징 할 수 있다.
◼ Touch event detection
ListView 에서는 OnItemClickListener 를 통해 아이템들의 클릭 여부를 감지 할 수 있다.
RecyclerView 에서는 onItemTouchListener 를 통해 뷰의 터치 이벤트를 감지한다.
조금 복잡하지만, 터치 이벤트를 RecyclerView 에 전달하기 전에 제어권을 가져옴으로써, 좀 더 유용하게 사용될 수 있다.
Gradle 에 라이브러기 추가하기
RecyclerView 는 Android 5.0(Lollipop) 버전에서 처음 소개한 widget 으로 SupportLibrary 에 포함되어 있다.
RecyclerView 를 사용하기 위해서는 build.grale 에 하단과 같이 코드를 추가해야 한다.
◼ v7 Support Libraries
◼ AndroidX
Layout 에 RecyclerView 추가하기
하단 코드와 같이 layout XML 파일에 RecyclerView 를 추가한다.
◼ v7 Support Libraries
◼ AndroidX
RecyclerView item view 추가하기
하단과 같이 RecyclerView item 에 표시될 item view layout 을 추가한다.
ViewHolder 구현하기
ViewHolder 는 각 layout 객체에 존재하는 view 를 보관하는 holder 객체다.
ListView, RecyclerView 는 inflate 를 최소화 하기 위해서 뷰를 재활용 하는데, findViewById 를 매번 호출 해야한다.
이로 인한 성능저하를 피하기 위해 ItemView 의 각 요소를 바로 엑세스 할 수 있도록 저장해두고 사용한다.
ViewHolder 관련 상세 설명은 이전 ListView 포스팅을 참조하기 바란다.
[Android/UI] - ListView (3) - ListView 에 image 추가하기
Adpater 구현하기
Data(text) 를 RecycerView 에 표현하기 위해서는 Adapter 가 필요하다.
Adapter 는 하단과 같이 데이터와 화면에 출력될 item view 를 연결해 주는 역할을 한다.
◼ onCreateViewHolder(ViewGroup parent, int viewType)
ViewHolder 생성 시에 호출된다.
처음 화면에 보이는 view 의 ViewHolder 객체를 생성하며, 화면에 보이는 만큼의 ViewHolder 객체가 생성되면 이후 호출되지 않는다.
ViewType 형태에 따라 다른 type 의 ViewHolder 객체를 생성할 수 있다.
◼ onBindViewHolder(ViewHolder holder, int position)
스크롤 등으로 특정 position 의 data 를 새롭게 표시해야 할 때마다 호출.
Position 에 해당하는 데이터를 ViewHolder 에 연결하여 item view 에 표시.
◼ getItemCount()
전체 item 개수 반환.
반환 되는 개수에 따라 생성되는 Item 의 개수가 정해진다.
RecycerView 에 LayoutManager 설정 및 Adapter 연결
이제 위에서 만든 Adapter 에 LayoutManager 와 Adapter 를 설정해야 한다.
Source code
https://github.com/parkho79/RecyclerView_1