학습 - RecyclerView

📚 Recycler View

👀 Recycler View 란?

  • "사용자가 관리하는 많은 수의 데이터 집합(Data Set)을 개별 아이템 단위로 구성하여 화면에 출력하는 뷰그룹(ViewGroup)이며, 한 화면에 표시되기 힘든 많은 수의 데이터를 스크롤 가능한 리스트로 표시해주는 위젯"입니다.

  • RecyclerView 이름에서 알 수 있듯이 View를 감싸는 컨테이너인 View Holder를 재활용하는 클래스(라이브러리)이며, View Holder 에 담긴 View를 ItemView 라고 합니다.

  • 기능을 봤을 때는 ListView와 유사해 보이나, ListView 보다 성능과 유연성을 높인 ListView의 확장판이라 생각하시면 됩니다.

👀 Recycler View 장점

  • ListView 의 경우, ViewHolder 패턴을 선택적으로 이용하기 때문에 ViewHolder 패턴을 사용하지 않을 경우 데이터가 갱신될 때마다 매번 ItemView를 구성하기 때문에 성능이 저하될 수 있는 문제가 발생했습니다.

    즉, ItemView가 많아지면 ItemView를 생성하는 속도가 느려지는 문제가 발생합니다.

  • 만약 ViewHolder 패턴을 ListView에 적용하고 싶다면, 기능을 재구성하거나 복잡한 코드를 짜야합니다.

  • RecyclerView 는 ViewHolder 패턴을 반드시 사용하기 때문에, 사용자가 눈에 보이는 화면의 View 만 데이터를 바인딩하여 보여주어 성능적으로 더 뛰어납니다.

  • 또한 기본적으로 ListView은 수직 방향으로만 View를 배치할 수 있었지만, RecyclerView는 수직, 수평, 그리드, 모양이 다른 그리드 형식으로 배치할 수 있고 런타임 때 이를 변경할 수도 있어 더 유연하게 View를 배치할 수 있습니다.

👀 Recycler View 구성

  1. LayoutManager
  • ItemView 의 위치를 올바르게 배치하도록 돕는 클래스

  • ItemView 가 나열되는 형식을 관리해주는 클래스

👉 배치 종류

1. 리니어(LinearLayoutManager) : 수평(Horizontal) 또는 수직(Vertical) 방향, 일렬(Linear)로 아이템 뷰 배치.

2. 그리드(GridLayoutManager) : 바둑판 모양의 격자(Grid) 형태로 아이템 뷰 배치.

3. 스태거드그리드(StaggeredGridLayoutManager) : 엇갈림(Staggered) 격자(Grid) 형태로 아이템 뷰 배치.
  1. Adapter
  • ViewHolder 를 생성

  • ViewHolder 에 데이터 목록을 바인딩하여 ItemView 를 생성 (= 데이터 목록을 바인딩하여 ItemView 를 생성하고 이를 ViewHolder 에 담아 화면에 표시)

  • Data Set이 변경되었을 때 RecyclerView에게 알리는(=notify) 작업도 담당

  • 유저가 ItemView를 클릭할 때 발생하는 상호작용(=클릭 리스너) 처리 작업도 담당합니다.

  • RecyclerView를 구성하는 ItemView의 형태(=ViewType)가 동일하지 않고 다른 경우를 처리하는 작업도 Adapter가 담당합니다.

  1. Recycler Viewer
  • 새로운 ViewHolder 인스턴스 생성을 어댑터에게 요청

  • 지정된 위치의 데이터항목에 ViewHolder를 바인딩하도록 어댑터에 요청

  • RecyclerViewer의 관심사

    • RecyclerView는 View에 관심없고 ViewHolder에 관심있다.

      즉, RecyclerViewer 는 데이터를 몰라야 한다.
      대신 Adapter에 ViewHolder에 생성 요청 또는 데이터를 바인딩하도록 요청을 한다

  1. View Holder
  • ItemView 를 저장하는 클래스

  • ViewHolder는 itemView의 참조를 가짐

  • 어댑터에 의해 관리되는데, 필요에 따라(좀 더 정확히는, 레이아웃매니저의 아이템 뷰 재활용 정책에 따라) 어댑터에서 생성됩니다. 물론, 미리 생성된 뷰홀더 객체가 있는 경우에는 새로 생성하지 않고 이미 만들어져 있는 뷰홀더를 재활용하는데, 이 때는 단순히 데이터가 뷰홀더의 아이템 뷰에 바인딩(Binding)됩니다.

👀 Recycler View 구현 순서

  1. Activity 또는 Fragment에 RecyclerViewLayout 배치

  2. ItemView Layout 생성

  3. Adapter 구현

    1. ViewHolder 클래스 구현
    2. 필요한 메서드 오버라이드하기
    • onCreateViewHolder(ViewGroup parent, int viewType) : viewType 형태의 아이템 뷰를 위한 뷰홀더 객체 생성.
    • onBindViewHolder(ViewHolder holder, int position) : position에 해당하는 데이터를 뷰홀더의 아이템뷰에 표시.
    • getItemCount() : 전체 아이템 갯수 리턴.
  4. Adapter, LayoutManager 지정

👀 Recycler View 데이터 갱신

  • notifyDataSetChanged : 화면의 모든 item을 즉시 redraw

    • poorperformance,복잡한 계산 or 사용자가 스크롤링을 동시에 하는 경우 등flicker현상이 나타나거나 스크롤이 버벅이는현상을 경험할 수 있다.

    • update가 필요한 위치만 RecyclerView에 정확히 알려줄 필요가 있다

👀 참고 사이트

  1. 공식문서
  1. 블로그

좋은 웹페이지 즐겨찾기