"사용자가 관리하는 많은 수의 데이터 집합(Data Set)을 개별 아이템 단위로 구성하여 화면에 출력하는 뷰그룹(ViewGroup)이며, 한 화면에 표시되기 힘든 많은 수의 데이터를 스크롤 가능한 리스트로 표시해주는 위젯"입니다.
RecyclerView 이름에서 알 수 있듯이 View를 감싸는 컨테이너인 View Holder를 재활용하는 클래스(라이브러리)이며, View Holder 에 담긴 View를 ItemView
라고 합니다.
기능을 봤을 때는 ListView와 유사해 보이나, ListView 보다 성능과 유연성을 높인 ListView의 확장판이라 생각하시면 됩니다.
ListView 의 경우, ViewHolder 패턴을 선택적으로 이용하기 때문에 ViewHolder 패턴을 사용하지 않을 경우 데이터가 갱신될 때마다 매번 ItemView를 구성하기 때문에 성능이 저하될 수 있는 문제가 발생했습니다.
즉, ItemView가 많아지면 ItemView를 생성하는 속도가 느려지는 문제가 발생합니다.
만약 ViewHolder 패턴을 ListView에 적용하고 싶다면, 기능을 재구성하거나 복잡한 코드를 짜야합니다.
RecyclerView 는 ViewHolder 패턴을 반드시 사용하기 때문에, 사용자가 눈에 보이는 화면의 View 만 데이터를 바인딩하여 보여주어 성능적으로 더 뛰어납니다.
또한 기본적으로 ListView은 수직 방향으로만 View를 배치할 수 있었지만, RecyclerView는 수직, 수평, 그리드, 모양이 다른 그리드 형식으로 배치할 수 있고 런타임 때 이를 변경할 수도 있어 더 유연하게 View를 배치할 수 있습니다.
ItemView 의 위치를 올바르게 배치하도록 돕는 클래스
ItemView 가 나열되는 형식을 관리해주는 클래스
1. 리니어(LinearLayoutManager) : 수평(Horizontal) 또는 수직(Vertical) 방향, 일렬(Linear)로 아이템 뷰 배치.
2. 그리드(GridLayoutManager) : 바둑판 모양의 격자(Grid) 형태로 아이템 뷰 배치.
3. 스태거드그리드(StaggeredGridLayoutManager) : 엇갈림(Staggered) 격자(Grid) 형태로 아이템 뷰 배치.
ViewHolder 를 생성
ViewHolder 에 데이터 목록을 바인딩하여 ItemView 를 생성 (= 데이터 목록을 바인딩하여 ItemView 를 생성하고 이를 ViewHolder 에 담아 화면에 표시)
Data Set이 변경되었을 때 RecyclerView에게 알리는(=notify) 작업도 담당
유저가 ItemView를 클릭할 때 발생하는 상호작용(=클릭 리스너) 처리 작업도 담당합니다.
RecyclerView를 구성하는 ItemView의 형태(=ViewType)가 동일하지 않고 다른 경우를 처리하는 작업도 Adapter가 담당합니다.
새로운 ViewHolder 인스턴스 생성을 어댑터에게 요청
지정된 위치의 데이터항목에 ViewHolder를 바인딩하도록 어댑터에 요청
RecyclerViewer의 관심사
즉, RecyclerViewer 는 데이터를 몰라야 한다.
대신 Adapter에 ViewHolder에 생성 요청 또는 데이터를 바인딩하도록 요청을 한다
ItemView 를 저장하는 클래스
ViewHolder는 itemView의 참조를 가짐
어댑터에 의해 관리되는데, 필요에 따라(좀 더 정확히는, 레이아웃매니저의 아이템 뷰 재활용 정책에 따라) 어댑터에서 생성됩니다. 물론, 미리 생성된 뷰홀더 객체가 있는 경우에는 새로 생성하지 않고 이미 만들어져 있는 뷰홀더를 재활용하는데, 이 때는 단순히 데이터가 뷰홀더의 아이템 뷰에 바인딩(Binding)됩니다.
Activity 또는 Fragment에 RecyclerViewLayout 배치
ItemView Layout 생성
Adapter 구현
Adapter, LayoutManager 지정
notifyDataSetChanged : 화면의 모든 item을 즉시 redraw
poorperformance,복잡한 계산 or 사용자가 스크롤링을 동시에 하는 경우 등flicker현상이 나타나거나 스크롤이 버벅이는현상을 경험할 수 있다.
update가 필요한 위치만 RecyclerView에 정확히 알려줄 필요가 있다