다음을 통해 공유


RecyclerView 파트 및 기능

RecyclerView 는 뷰의 스크롤 및 재활용과 같은 일부 작업을 내부적으로 처리하지만, 기본적으로 도우미 클래스를 조정하여 컬렉션을 표시하는 관리자입니다. RecyclerView 는 다음 도우미 클래스에 태스크를 위임합니다.

  • Adapter – 항목 레이아웃을 부풀리고(레이아웃 파일의 내용을 인스턴스화) 내에 표시되는 RecyclerView뷰에 데이터를 바인딩합니다. 어댑터는 항목 클릭 이벤트도 보고합니다.

  • LayoutManager – 항목 보기를 RecyclerView 측정하고 위치 지정하고 뷰 재활용에 대한 정책을 관리합니다.

  • ViewHolder – 조회 및 보기 참조를 저장합니다. 보기 보유자는 항목 보기 클릭을 검색하는 데도 도움이 됩니다.

  • ItemDecoration – 앱에서 항목, 강조 표시 및 시각적 그룹화 경계 간에 구분선을 그리기 위한 특정 보기에 특수 그리기 및 레이아웃 오프셋을 추가할 수 있습니다.

  • ItemAnimator – 항목 작업 중 또는 어댑터를 변경할 때 발생하는 애니메이션을 정의합니다.

다음 다이어그램에서는 RecyclerView클래스 LayoutManagerAdapter 클래스 간의 관계를 보여 줍니다.

Diagram of RecyclerView containing LayoutManager, using Adapter to access Data Set

이 그림에서 알 수 있듯이, 과 LayoutManager 사이의 중개 AdapterRecyclerView자로 생각할 수 있습니다. 를 LayoutManager 대신하여 메서드를 Adapter 호출합니다 RecyclerView. 예를 들어 메서드는 LayoutManager 특정 항목 위치에 대한 새 뷰를 만들 때 메서드를 호출 Adapter 합니다 RecyclerView. 해당 Adapter 항목의 레이아웃을 확장하고 해당 위치에 있는 뷰에 대한 참조를 캐시하는 인스턴스(표시되지 않음)를 만듭니다 ViewHolder . LayoutManager 특정 항목을 데이터 집합 Adapter 에 바인딩하기 위해 호출 Adapter 하는 경우 해당 항목의 데이터를 찾아 데이터 집합에서 검색한 다음 연결된 항목 보기에 복사합니다.

앱에서 사용하는 RecyclerView 경우 다음 클래스의 파생 형식을 만들어야 합니다.

  • RecyclerView.Adapter – 앱의 데이터 집합(앱과 관련된)에서 안에 표시되는 항목 보기에 대한 바인딩을 RecyclerView제공합니다. 어댑터는 데이터 원본의 특정 위치에 각 항목 보기 위치를 RecyclerView 연결하는 방법을 알고 있습니다. 또한 어댑터는 각 개별 항목 보기 내의 콘텐츠 레이아웃을 처리하고 각 보기에 대한 뷰 홀더를 만듭니다. 어댑터는 항목 보기에서 검색된 항목 클릭 이벤트도 보고합니다.

  • RecyclerView.ViewHolder – 리소스 조회가 불필요하게 반복되지 않도록 항목 레이아웃 파일의 뷰에 대한 참조를 캐시합니다. 또한 뷰 홀더는 사용자가 보기 소유자의 연결된 항목 보기를 탭할 때 항목 클릭 이벤트를 어댑터에 전달하도록 정렬합니다.

  • RecyclerView.LayoutManager – 내의 항목을 배치합니다 RecyclerView. 미리 정의된 여러 레이아웃 관리자 중 하나를 사용하거나 사용자 지정 레이아웃 관리자를 구현할 수 있습니다. RecyclerView 레이아웃 정책을 레이아웃 관리자에 위임하므로 앱을 크게 변경하지 않고도 다른 레이아웃 관리자를 연결할 수 있습니다.

또한 필요에 따라 다음 클래스를 확장하여 앱의 RecyclerView 모양과 느낌을 변경할 수 있습니다.

  • RecyclerView.ItemDecoration
  • RecyclerView.ItemAnimator

확장 ItemDecorationItemAnimatorRecyclerView 하지 않고 기본 구현을 사용합니다. 이 가이드에서는 사용자 지정 ItemDecorationItemAnimator 클래스를 만드는 방법을 설명하지 않습니다. 이러한 클래스에 대한 자세한 내용은 RecyclerView.ItemDecorationRecyclerView.ItemAnimator를 참조하세요.

재활용 보기 작동 방식

RecyclerView 는 데이터 원본의 모든 항목에 대해 항목 보기를 할당하지 않습니다. 대신 화면에 맞는 항목 보기의 수만 할당하고 사용자가 스크롤할 때 해당 항목 레이아웃을 다시 사용합니다. 보기가 처음 보이지 않게 스크롤되면 다음 그림에 설명된 재활용 프로세스를 거치게 됩니다.

Diagram illustrating the six steps of view recycling

  1. 보기가 보이지 않고 스크롤되어 더 이상 표시되지 않으면 스크랩 보기됩니다.

  2. 스크랩 보기는 풀에 배치되고 재활용 보기됩니다. 이 풀은 동일한 형식의 데이터를 표시하는 뷰의 캐시입니다.

  3. 새 항목을 표시할 때 다시 사용하려면 재활용 풀에서 뷰를 가져옵니다. 이 뷰는 표시되기 전에 어댑터에 의해 다시 바인딩되어야 하므로 더티 보기라고 합니다.

  4. 더티 보기가 재활용됩니다. 어댑터는 표시할 다음 항목에 대한 데이터를 찾아 이 항목의 보기에 복사합니다. 이러한 보기에 대한 참조는 재활용된 뷰와 연결된 뷰 소유자에서 검색됩니다.

  5. 재활용된 보기는 화면에 표시될 항목 RecyclerView 목록에 추가됩니다.

  6. 사용자가 목록의 다음 항목으로 스크롤 RecyclerView 하면 재활용된 보기가 화면에 표시됩니다. 한편, 다른 보기는 보이지 않는 스크롤하고 위의 단계에 따라 재활용됩니다.

항목 보기 재사용 외에도 또 다른 효율성 최적화인 RecyclerView 뷰 홀더를 사용합니다. 뷰 홀더는 보기 참조를 캐시하는 간단한 클래스입니다. 어댑터가 항목 레이아웃 파일을 확장할 때마다 해당 뷰 홀더도 생성됩니다. 뷰 홀더는 팽창된 항목 레이아웃 파일 내의 보기에 대한 참조를 가져오는 데 사용합니다 FindViewById . 이러한 참조는 레이아웃을 재활용하여 새 데이터를 표시할 때마다 뷰에 새 데이터를 로드하는 데 사용됩니다.

레이아웃 관리자

레이아웃 관리자는 디스플레이의 RecyclerView 항목 위치를 지정합니다. 프레젠테이션 유형(목록 또는 눈금), 방향(항목이 세로 또는 가로로 표시되는지 여부) 및 표시해야 하는 방향 항목(일반 순서 또는 역순)을 결정합니다. 또한 레이아웃 관리자는 RecycleView 디스플레이에서 각 항목의 크기와 위치를 계산합니다.

레이아웃 관리자는 사용자에게 더 이상 표시되지 않는 항목 보기를 재활용할 시기에 대한 정책을 결정합니다. 레이아웃 관리자는 어떤 보기가 표시되는지(그리고 표시되지 않는 뷰는) 인식하므로 뷰를 재활용할 수 있는 시기를 결정하는 것이 가장 좋습니다. 보기를 재활용하기 위해 레이아웃 관리자는 일반적으로 어댑터를 호출하여 재활용된 보기의 내용을 다른 데이터로 바꿉니다. 이는 이전에 재활용 보기 작동 방식에 설명된 대로입니다.

확장 RecyclerView.LayoutManager 하여 고유한 레이아웃 관리자를 만들거나 미리 정의된 레이아웃 관리자를 사용할 수 있습니다. RecyclerView 는 다음과 같은 미리 정의된 레이아웃 관리자를 제공합니다.

  • LinearLayoutManager – 세로로 스크롤할 수 있는 열이나 가로로 스크롤할 수 있는 행의 항목을 정렬합니다.

  • GridLayoutManager – 표에 항목을 표시합니다.

  • StaggeredGridLayoutManager – 일부 항목의 높이와 너비가 다른 엇갈리게 표시된 눈금에 항목을 표시합니다.

레이아웃 관리자를 지정하려면 선택한 레이아웃 관리자를 인스턴스화하고 메서드에 SetLayoutManager 전달합니다. 레이아웃 관리자 RecyclerView 를 지정해야 합니다. 기본적으로 미리 정의된 레이아웃 관리자는 선택하지 않습니다.

레이아웃 관리자 에 대한 자세한 내용은 RecyclerView.LayoutManager 클래스 참조를 참조하세요.

뷰 홀더

뷰 보유자는 캐싱 뷰 참조에 대해 정의하는 클래스입니다. 어댑터는 이러한 뷰 참조를 사용하여 각 보기를 해당 콘텐츠에 바인딩합니다. 모든 항목에는 해당 항목에 RecyclerView 대한 뷰 참조를 캐시하는 연결된 뷰 소유자 인스턴스가 있습니다. 뷰 소유자를 만들려면 다음 단계를 사용하여 항목당 정확한 보기 집합을 보유하는 클래스를 정의합니다.

  1. 하위 클래스 .RecyclerView.ViewHolder
  2. 뷰 참조를 조회하고 저장하는 생성자를 구현합니다.
  3. 어댑터가 이러한 참조에 액세스하는 데 사용할 수 있는 속성을 구현합니다.

구현의 ViewHolder 자세한 예제는 기본 RecyclerView 예제표시됩니다. 자세한 RecyclerView.ViewHolder내용은 RecyclerView.ViewHolder 클래스 참조를 참조하세요.

어댑터

대부분의 통합 코드는 RecyclerView 어댑터에서 발생합니다. RecyclerView 에서는 데이터 원본에 액세스하기 위해 파생된 RecyclerView.Adapter 어댑터를 제공하고 각 항목을 데이터 원본의 콘텐츠로 채워야 합니다. 데이터 원본은 앱별이므로 데이터에 액세스하는 방법을 이해하는 어댑터 기능을 구현해야 합니다. 어댑터는 데이터 원본에서 정보를 추출하여 컬렉션의 각 항목에 RecyclerView 로드합니다.

다음 드로잉에서는 어댑터가 뷰 홀더를 통해 데이터 원본의 콘텐츠를 각 행 항목 내의 개별 뷰에 매핑하는 RecyclerView방법을 보여 줍니다.

Diagram illustrating Adapter connecting Data Source to ViewHolders

어댑터는 특정 행 항목에 대한 데이터를 사용하여 각 RecyclerView 행을 로드합니다. 예를 들어 행 위치 P의 경우 어댑터는 데이터 원본 내의 P 위치에 연결된 데이터를 찾아 컬렉션의 P 위치에 있는 행 항목에 RecyclerView 이 데이터를 복사합니다. 예를 들어 위 드로잉에서 어댑터는 뷰 홀더를 사용하여 해당 위치에 대한 ImageViewTextView 참조를 조회하므로 사용자가 컬렉션을 스크롤하고 보기를 다시 사용할 때 해당 뷰를 반복적으로 호출 FindViewById 할 필요가 없습니다.

어댑터를 구현하는 경우 다음 RecyclerView.Adapter 메서드를 재정의해야 합니다.

  • OnCreateViewHolder – 항목 레이아웃 파일 및 보기 소유자를 인스턴스화합니다.

  • OnBindViewHolder – 지정된 위치에 있는 데이터를 해당 참조가 지정된 뷰 소유자에 저장되는 뷰에 로드합니다.

  • ItemCount – 데이터 원본의 항목 수를 반환합니다.

레이아웃 관리자는 항목의 위치를 지정하는 동안 이러한 메서드를 RecyclerView호출합니다.

RecyclerView에 데이터 변경 내용 알림

RecyclerView 는 데이터 원본의 내용이 변경되면 디스플레이를 자동으로 업데이트하지 않습니다. 데이터 집합이 변경되면 어댑터가 알려 RecyclerView 야 합니다. 데이터 집합은 여러 가지 방법으로 변경됩니다. 예를 들어 항목 내의 내용이 변경되거나 데이터의 전체 구조가 변경될 수 있습니다. RecyclerView.Adapter 는 가장 효율적인 방식으로 데이터 변경에 응답할 수 있도록 RecyclerView 호출할 수 있는 여러 메서드를 제공합니다.

  • NotifyItemChanged – 지정된 위치에 있는 항목이 변경되었음을 나타냅니다.

  • NotifyItemRangeChanged – 지정된 위치 범위의 항목이 변경되었음을 나타냅니다.

  • NotifyItemInserted – 지정된 위치에 있는 항목이 새로 삽입되었음을 나타냅니다.

  • NotifyItemRangeInserted – 지정된 위치 범위의 항목이 새로 삽입되었음을 나타냅니다.

  • NotifyItemRemoved – 지정된 위치에 있는 항목이 제거되었음을 나타냅니다.

  • NotifyItemRangeRemoved – 지정된 위치 범위의 항목이 제거되었음을 나타냅니다.

  • NotifyDataSetChanged – 데이터 집합이 변경되었음을 나타냅니다(전체 업데이트 강제).

데이터 집합이 어떻게 변경되었는지 정확히 알고 있는 경우 위의 적절한 메서드를 호출하여 가장 효율적인 방식으로 새로 고칠 RecyclerView 수 있습니다. 데이터 집합이 어떻게 변경되었는지 정확히 알 수 없는 경우 사용자에게 표시되는 모든 보기를 새로 고쳐야 하므로 RecyclerView 훨씬 덜 효율적인 호출NotifyDataSetChanged을 수행할 수 있습니다. 이러한 메서드에 대한 자세한 내용은 RecyclerView.Adapter를 참조하세요.

다음 항목인 Basic RecyclerView 예제에서는 위에서 설명한 부분 및 기능의 실제 코드 예제를 보여 주는 예제 앱이 구현됩니다.