티스토리 뷰
지난 포스팅에는 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
'Android > UI' 카테고리의 다른 글
RecyclerView (3) - RecyclerView item 의 click 처리하기 (0) | 2021.02.17 |
---|---|
RecyclerView (2) - RecyclerView 에 image + text 출력하기 (0) | 2021.02.17 |
GridView (7) - GridView 에 header, footer 달기 (0) | 2021.02.17 |
GridView (6) - GridView item 추가, 수정, 삭제 (0) | 2021.02.17 |
GridView (5) - GridView item long click 시 popup menu 출력하기 (0) | 2021.02.17 |
- Total
- Today
- Yesterday
- registerForContextMenu
- android task
- bindservice
- p2e
- android activity flag
- 안드로이드 인텐트
- task 생성
- onContextItemSelected
- notifyDataSetChanged
- android flag activity
- 앱테크
- 채굴앱
- mPANDO
- Intent
- Android Service
- M2E
- task
- 안드로이드 서비스
- 무료 채굴
- RoomDatabase
- StringUtils
- 리워드앱
- StartService
- 리워드 어플
- WEMIX
- 무료채굴
- android intent
- BroadcastReceiver
- 앱테크 추천
- onCreateContextMenu
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |