RecyclerView 파트 및 기능RecyclerView Parts and Functionality

RecyclerView는 내부적으로 일부 작업 (예: 뷰의 스크롤 및 재생)을 처리 하지만, 기본적으로 도우미 클래스를 조정 하 여 컬렉션을 표시 하는 관리자입니다.RecyclerView handles some tasks internally (such as the scrolling and recycling of views), but it is essentially a manager that coordinates helper classes to display a collection. RecyclerView는 다음 도우미 클래스에 작업을 위임 합니다.RecyclerView delegates tasks to the following helper classes:

  • Adapter – 늘어납니다 항목 레이아웃 (레이아웃 파일의 콘텐츠를 인스턴스화) 하 고 데이터를 RecyclerView내에 표시 되는 뷰에 바인딩합니다.Adapter – Inflates item layouts (instantiates the contents of a layout file) and binds data to views that are displayed within a RecyclerView. 또한 어댑터는 항목 클릭 이벤트를 보고 합니다.The adapter also reports item-click events.

  • LayoutManagerRecyclerView 내에서 항목 보기를 측정 및 배치 하 고 뷰 재활용에 대 한 정책을 관리 합니다.LayoutManager – Measures and positions item views within a RecyclerView and manages the policy for view recycling.

  • ViewHolder – 조회 하 고 뷰 참조를 저장 합니다.ViewHolder – Looks up and stores view references. 뷰 보유자는 항목 보기 클릭을 검색 하는 데도 도움이 됩니다.The view holder also helps with detecting item-view clicks.

  • ItemDecoration –를 사용 하면 앱에서 항목, 강조 표시 및 시각적 그룹화 경계 사이의 분할자를 그리기 위해 특정 보기에 특수 그리기 및 레이아웃 오프셋을 추가할 수 있습니다.ItemDecoration – Allows an app to add special drawing and layout offsets to specific views for drawing dividers between items, highlights, and visual grouping boundaries.

  • ItemAnimator –는 항목 작업 중에 발생 하거나 어댑터를 변경 하는 동안 발생 하는 애니메이션을 정의 합니다.ItemAnimator – Defines the animations that take place during item actions or as changes are made to the adapter.

RecyclerView, LayoutManagerAdapter 클래스 간의 관계는 다음 다이어그램에 나와 있습니다.The relationship between the RecyclerView, LayoutManager, and Adapter classes is depicted in the following diagram:

어댑터를 사용 하 여 데이터 집합에 액세스 하는 LayoutManager를 포함 하는 RecyclerView의 다이어그램

이 그림에서 설명 하는 것 처럼 LayoutManagerAdapterRecyclerView의 중개자로 간주할 수 있습니다.As this figure illustrates, the LayoutManager can be thought of as the intermediary between the Adapter and the RecyclerView. LayoutManagerRecyclerView를 대신 하 여 Adapter 메서드를 호출 합니다.The LayoutManager makes calls into Adapter methods on behalf of the RecyclerView. 예를 들어 LayoutManagerRecyclerView에서 특정 항목 위치에 대 한 새 뷰를 만들 때 Adapter 메서드를 호출 합니다.For example, the LayoutManager calls an Adapter method when it is time to create a new view for a particular item position in the RecyclerView. Adapter는 해당 항목의 레이아웃을 늘어납니다 하 고 ViewHolder 인스턴스 (표시 되지 않음)를 만들어 해당 위치의 뷰에 대 한 참조를 캐시 합니다.The Adapter inflates the layout for that item and creates a ViewHolder instance (not shown) to cache references to the views at that position. LayoutManager에서 Adapter를 호출 하 여 특정 항목을 데이터 Adapter 집합에 바인딩하는 경우 해당 항목에 대 한 데이터를 찾아 데이터 집합에서 검색 한 다음 연결 된 항목 뷰로 복사 합니다.When the LayoutManager calls the Adapter to bind a particular item to the data set, the Adapter locates the data for that item, retrieves it from the data set, and copies it to the associated item view.

앱에서 RecyclerView를 사용 하는 경우 다음 클래스의 파생 형식 만들기가 필요 합니다.When using RecyclerView in your app, creating derived types of the following classes is required:

  • RecyclerView.Adapter – 앱의 데이터 집합 (앱에만 해당)에서 RecyclerView내에 표시 되는 항목 뷰로의 바인딩을 제공 합니다.RecyclerView.Adapter – Provides a binding from your app's data set (which is specific to your app) to item views that are displayed within the RecyclerView. 어댑터는 RecyclerView의 각 항목 뷰 위치를 데이터 원본의 특정 위치에 연결 하는 방법을 알고 있습니다.The adapter knows how to associate each item-view position in the RecyclerView to a specific location in the data source. 또한 어댑터는 각 개별 항목 보기 내에서 콘텐츠의 레이아웃을 처리 하 고 각 보기에 대 한 보기 홀더를 만듭니다.In addition, the adapter handles the layout of the contents within each individual item view and creates the view holder for each view. 또한 어댑터는 항목 보기에서 검색 된 항목 클릭 이벤트를 보고 합니다.The adapter also reports item-click events that are detected by the item view.

  • RecyclerView.ViewHolder –는 리소스 조회가 불필요 하 게 반복 되지 않도록 항목 레이아웃 파일의 뷰에 대 한 참조를 캐시 합니다.RecyclerView.ViewHolder – Caches references to the views in your item layout file so that resource lookups are not repeated unnecessarily. 또한 보기 소유자는 사용자가 보기 소유자의 연결 된 항목 보기를 누를 때 어댑터에 전달 될 항목 클릭 이벤트를 정렬 합니다.The view holder also arranges for item-click events to be forwarded to the adapter when a user taps the view-holder's associated item view.

  • RecyclerView내에서 항목 – 위치를 RecyclerView.LayoutManager 합니다.RecyclerView.LayoutManager – Positions items within the RecyclerView. 미리 정의 된 여러 레이아웃 관리자 중 하나를 사용 하거나 고유한 사용자 지정 레이아웃 관리자를 구현할 수 있습니다.You can use one of several predefined layout managers or you can implement your own custom layout manager. RecyclerView 레이아웃 정책을 레이아웃 관리자에 위임 하므로, 앱을 크게 변경할 필요 없이 다른 레이아웃 관리자에 연결할 수 있습니다.RecyclerView delegates the layout policy to the layout manager, so you can plug in a different layout manager without having to make significant changes to your app.

또한 필요에 따라 다음 클래스를 확장 하 여 앱에서 RecyclerView의 모양과 느낌을 변경할 수 있습니다.Also, you can optionally extend the following classes to change the look and feel of RecyclerView in your app:

  • RecyclerView.ItemDecoration
  • RecyclerView.ItemAnimator

ItemDecorationItemAnimator를 확장 하지 않는 경우 RecyclerView 기본 구현을 사용 합니다.If you do not extend ItemDecoration and ItemAnimator, RecyclerView uses default implementations. 이 가이드에서는 사용자 지정 ItemDecorationItemAnimator 클래스를 만드는 방법에 대해서는 설명 하지 않습니다. 이러한 클래스에 대 한 자세한 내용은 RecyclerViewRecyclerView를 참조 하세요.This guide does not explain how to create custom ItemDecoration and ItemAnimator classes; for more information about these classes, see RecyclerView.ItemDecoration and RecyclerView.ItemAnimator.

보기 재활용 작동 방법How View Recycling Works

RecyclerView는 데이터 원본의 모든 항목에 대해 항목 뷰를 할당 하지 않습니다.RecyclerView does not allocate an item view for every item in your data source. 대신 화면에 맞는 항목 보기의 수만 할당 하 고 사용자가 스크롤하면 해당 항목 레이아웃을 다시 사용 합니다.Instead, it allocates only the number of item views that fit on the screen and it reuses those item layouts as the user scrolls. 뷰가 먼저 표시 되지 않는 경우 다음 그림에 설명 된 재생 프로세스를 진행 합니다.When the view first scrolls out of sight, it goes through the recycling process illustrated in the following figure:

뷰 재활용의 6 단계를 보여 주는다이어그램Diagram illustrating the six steps of view recycling

  1. 뷰가 보이지 않게 스크롤될 때 더 이상 표시 되지 않으면 스크랩 뷰가됩니다.When a view scrolls out of sight and is no longer displayed, it becomes a scrap view.

  2. 스크랩 보기는 풀에 배치 되 고 재활용 뷰가됩니다.The scrap view is placed in a pool and becomes a recycle view. 이 풀은 동일한 형식의 데이터를 표시 하는 보기의 캐시입니다.This pool is a cache of views that display the same type of data.

  3. 새 항목이 표시 되 면 재활용 풀에서 뷰를 다시 사용 합니다.When a new item is to be displayed, a view is taken from the recycle pool for reuse. 이 뷰는 표시 되기 전에 어댑터에 의해 다시 바인딩되어야 하므로 더티 보기라고 합니다.Because this view must be re-bound by the adapter before being displayed, it is called a dirty view.

  4. 더티 뷰가 재활용 됩니다. 어댑터는 표시 될 다음 항목에 대 한 데이터를 찾고이 항목에 대 한 보기에이 데이터를 복사 합니다.The dirty view is recycled: the adapter locates the data for the next item to be displayed and copies this data to the views for this item. 이러한 보기에 대 한 참조는 재활용 된 뷰와 연결 된 뷰 보유자에서 검색 됩니다.References for these views are retrieved from the view holder associated with the recycled view.

  5. 화면에 표시 되는 RecyclerView의 항목 목록에 재활용 된 보기가 추가 됩니다.The recycled view is added to the list of items in the RecyclerView that are about to go on-screen.

  6. 사용자가 RecyclerView를 목록의 다음 항목으로 스크롤하면 재활용 된 보기가 화면에 표시 됩니다.The recycled view goes on-screen as the user scrolls the RecyclerView to the next item in the list. 한편, 다른 보기는 위 단계에 따라 표시 되지 않으며 재활용 됩니다.Meanwhile, another view scrolls out of sight and is recycled according to the above steps.

항목 뷰 다시 사용 외에도 RecyclerView 다른 효율성 최적화를 사용 합니다. 뷰 소유자.In addition to item-view reuse, RecyclerView also uses another efficiency optimization: view holders. 뷰 보유자 는 뷰 참조를 캐시 하는 간단한 클래스입니다.A view holder is a simple class that caches view references. 어댑터는 항목 레이아웃 파일을 늘어납니다 때마다 해당 하는 뷰 보유자를 만듭니다.Each time the adapter inflates an item-layout file, it also creates a corresponding view holder. 뷰 보유자는 FindViewById을 사용 하 여 팽창 된 항목 레이아웃 파일 내의 뷰에 대 한 참조를 가져옵니다.The view holder uses FindViewById to get references to the views inside the inflated item-layout file. 이러한 참조는 새 데이터를 표시 하기 위해 레이아웃을 재활용할 때마다 새 데이터를 뷰에 로드 하는 데 사용 됩니다.These references are used to load new data into the views every time the layout is recycled to show new data.

레이아웃 관리자The Layout Manager

레이아웃 관리자는 RecyclerView 표시에서 항목의 위치를 지정 하는 일을 담당 합니다. 이는 프레젠테이션 유형 (목록 또는 그리드), 방향 (항목이 세로로 또는 가로로 표시 되는지 여부) 및 표시 되는 방향 항목 (보통 순서 또는 역순)을 결정 합니다.The layout manager is responsible for positioning items in the RecyclerView display; it determines the presentation type (a list or a grid), the orientation (whether items are displayed vertically or horizontally), and which direction items should be displayed (in normal order or in reverse order). 또한 레이아웃 관리자는 RecycleView 디스플레이에서 각 항목의 크기와 위치를 계산 하는 일을 담당 합니다.The layout manager is also responsible for calculating the size and position of each item in the RecycleView display.

레이아웃 관리자는 추가 목적이 있습니다 .이는 사용자에 게 더 이상 표시 되지 않는 항목 보기를 재활용 하는 시기에 대 한 정책을 결정 합니다.The layout manager has an additional purpose: it determines the policy for when to recycle item views that are no longer visible to the user. 레이아웃 관리자는 표시 되는 보기와 표시 되지 않는 뷰를 인식 하므로 뷰를 재활용할 수 있는 시기를 결정 하는 것이 가장 좋습니다.Because the layout manager is aware of which views are visible (and which are not), it is in the best position to decide when a view can be recycled. 뷰를 재생 하기 위해 레이아웃 관리자는 일반적으로 보기 재활용의 작동 방식에 설명 된 대로 일반적으로 어댑터를 호출 하 여 재활용 된 보기의 내용을 다른 데이터로 바꿉니다.To recycle a view, the layout manager typically makes calls to the adapter to replace the contents of a recycled view with different data, as described previously in How View Recycling Works.

RecyclerView.LayoutManager 확장 하 여 사용자 고유의 레이아웃 관리자를 만들거나 미리 정의 된 레이아웃 관리자를 사용할 수 있습니다.You can extend RecyclerView.LayoutManager to create your own layout manager, or you can use a predefined layout manager. RecyclerView는 다음과 같은 미리 정의 된 레이아웃 관리자를 제공 합니다.RecyclerView provides the following predefined layout managers:

  • LinearLayoutManager – 세로로 스크롤할 수 있는 열 또는 가로로 스크롤할 수 있는 행의 항목을 정렬 합니다.LinearLayoutManager – Arranges items in a column that can be scrolled vertically, or in a row that can be scrolled horizontally.

  • GridLayoutManager 표에 항목을 표시 합니다.GridLayoutManager – Displays items in a grid.

  • StaggeredGridLayoutManager –는 지그재그형 표에 항목을 표시 합니다. 여기서 일부 항목의 높이와 너비는 다릅니다.StaggeredGridLayoutManager – Displays items in a staggered grid, where some items have different heights and widths.

레이아웃 관리자를 지정 하려면 선택한 레이아웃 관리자를 인스턴스화하고 SetLayoutManager 메서드에 전달 합니다.To specify the layout manager, instantiate your chosen layout manager and pass it to the SetLayoutManager method. 기본적으로 미리 정의 된 레이아웃 관리자를 선택 하지 RecyclerView – 레이아웃 관리자를 지정 해야 합니다.Note that you must specify the layout manager – RecyclerView does not select a predefined layout manager by default.

레이아웃 관리자에 대 한 자세한 내용은 RecyclerView manager 클래스 참조를 참조 하세요.For more information about the layout manager, see the RecyclerView.LayoutManager class reference.

보기 홀더The View Holder

뷰 보유자는 뷰 참조를 캐시 하기 위해 정의 하는 클래스입니다.The view holder is a class that you define for caching view references. 어댑터는 이러한 뷰 참조를 사용 하 여 각 뷰를 해당 내용에 바인딩합니다.The adapter uses these view references to bind each view to its content. RecyclerView의 모든 항목에는 해당 항목에 대 한 뷰 참조를 캐시 하는 연결 된 뷰 홀더 인스턴스가 있습니다.Every item in the RecyclerView has an associated view holder instance that caches the view references for that item. 뷰 홀더를 만들려면 다음 단계를 사용 하 여 항목당 정확한 뷰 집합을 보유할 클래스를 정의 합니다.To create a view holder, use the following steps to define a class to hold the exact set of views per item:

  1. 서브 클래스 RecyclerView.ViewHolder입니다.Subclass RecyclerView.ViewHolder.
  2. 뷰 참조를 조회 하 고 저장 하는 생성자를 구현 합니다.Implement a constructor that looks up and stores the view references.
  3. 어댑터에서 이러한 참조에 액세스 하는 데 사용할 수 있는 속성을 구현 합니다.Implement properties that the adapter can use to access these references.

ViewHolder 구현의 자세한 예는 기본 RecyclerView 예제에 나와 있습니다.A detailed example of a ViewHolder implementation is presented in A Basic RecyclerView Example. RecyclerView.ViewHolder에 대 한 자세한 내용은 ViewHolder 클래스 참조를 참조 하세요.For more information about RecyclerView.ViewHolder, see the RecyclerView.ViewHolder class reference.

어댑터The Adapter

RecyclerView 통합 코드의 대부분은 어댑터에서 수행 됩니다.Most of the "heavy-lifting" of the RecyclerView integration code takes place in the adapter. RecyclerView 하려면 RecyclerView.Adapter에서 파생 된 어댑터를 제공 하 여 데이터 원본에 액세스 하 고 각 항목을 데이터 원본의 콘텐츠로 채워야 합니다.RecyclerView requires that you provide an adapter derived from RecyclerView.Adapter to access your data source and populate each item with content from the data source. 데이터 원본은 응용 프로그램 마다 다르기 때문에 데이터에 액세스 하는 방법을 이해 하는 어댑터 기능을 구현 해야 합니다.Because the data source is app-specific, you must implement adapter functionality that understands how to access your data. 어댑터는 데이터 원본에서 정보를 추출 하 여 RecyclerView 컬렉션의 각 항목에 로드 합니다.The adapter extracts information from the data source and loads it into each item in the RecyclerView collection.

다음 그림에서는 어댑터가 뷰 소유자를 통해 데이터 원본의 콘텐츠를 RecyclerView의 각 행 항목 내에 있는 개별 뷰에 매핑하는 방법을 보여 줍니다.The following drawing illustrates how the adapter maps content in a data source through view holders to individual views within each row item in the RecyclerView:

ViewHolders에 데이터 원본을 연결 하는 어댑터를 보여 주는다이어그램Diagram illustrating Adapter connecting Data Source to ViewHolders

어댑터는 특정 행 항목의 데이터를 사용 하 여 각 RecyclerView 행을 로드 합니다.The adapter loads each RecyclerView row with data for a particular row item. 예를 들어 행 위치 p의 경우 어댑터는 데이터 원본 내의 위치 p 에서 연결 된 데이터를 찾고이 데이터를 RecyclerView 컬렉션의 p 위치에 있는 행 항목에 복사 합니다.For row position P, for example, the adapter locates the associated data at position P within the data source and copies this data to the row item at position P in the RecyclerView collection. 예를 들어 위의 그리기에서 어댑터는 보기 소유자를 사용 하 여 ImageView에 대 한 참조를 조회 하 고 해당 위치에서 TextView 사용자가 컬렉션을 스크롤하고 뷰를 다시 사용할 때 해당 뷰에 대해 FindViewById를 반복적으로 호출할 필요가 없습니다.In the above drawing, for example, the adapter uses the view holder to lookup the references for the ImageView and TextView at that position so it doesn't have to repeatedly call FindViewById for those views as the user scrolls through the collection and reuses views.

어댑터를 구현 하는 경우 다음 RecyclerView.Adapter 메서드를 재정의 해야 합니다.When you implement an adapter, you must override the following RecyclerView.Adapter methods:

  • 항목 레이아웃 파일 및 보기 홀더를 인스턴스화하는 OnCreateViewHolder –입니다.OnCreateViewHolder – Instantiates the item layout file and view holder.

  • OnBindViewHolder – 지정 된 위치에 있는 데이터를 참조가 지정 된 뷰 보유자에 저장 된 뷰로 로드 합니다.OnBindViewHolder – Loads the data at the specified position into the views whose references are stored in the given view holder.

  • ItemCount –는 데이터 원본에 있는 항목 수를 반환 합니다.ItemCount – Returns the number of items in the data source.

레이아웃 관리자는 RecyclerView내에서 항목의 위치를 지정 하는 동안 이러한 메서드를 호출 합니다.The layout manager calls these methods while it is positioning items within the RecyclerView.

RecyclerView 데이터 변경 알림Notifying RecyclerView of Data Changes

데이터 원본의 내용이 변경 되 면 RecyclerView에서 자동으로 표시를 업데이트 하지 않습니다. 어댑터는 데이터 집합이 변경 되 면 RecyclerView에 알려야 합니다.RecyclerView does not automatically update its display when the contents of its data source changes; the adapter must notify RecyclerView when there is a change in the data set. 데이터 집합은 여러 가지 방법으로 변경 될 수 있습니다. 예를 들어 항목 내의 내용이 변경 되거나 전체 데이터 구조가 변경 될 수 있습니다.The data set can change in many ways; for example, the contents within an item can change or the overall structure of the data may be altered. RecyclerView.AdapterRecyclerView가 가장 효율적인 방식으로 데이터 변경 내용에 응답 하도록 호출할 수 있는 여러 메서드를 제공 합니다.RecyclerView.Adapter provides a number of methods that you can call so that RecyclerView responds to data changes in the most efficient manner:

  • NotifyItemChanged – 지정 된 위치에 있는 항목이 변경 되었음을 신호로 보냅니다.NotifyItemChanged – Signals that the item at the specified position has changed.

  • NotifyItemRangeChanged – 지정 된 위치 범위의 항목이 변경 되었음을 신호로 보냅니다.NotifyItemRangeChanged – Signals that the items in the specified range of positions have changed.

  • NotifyItemInserted – 지정 된 위치의 항목이 새로 삽입 되었음을 신호로 알립니다.NotifyItemInserted – Signals that the item in the specified position has been newly inserted.

  • NotifyItemRangeInserted – 지정 된 위치 범위의 항목이 새로 삽입 되었음을 신호로 보냅니다.NotifyItemRangeInserted – Signals that the items in the specified range of positions have been newly inserted.

  • NotifyItemRemoved – 지정 된 위치에 있는 항목이 제거 되었음을 신호로 알립니다.NotifyItemRemoved – Signals that the item in the specified position has been removed.

  • NotifyItemRangeRemoved – 지정 된 위치 범위의 항목이 제거 되었음을 신호로 보냅니다.NotifyItemRangeRemoved – Signals that the items in the specified range of positions have been removed.

  • NotifyDataSetChanged – 데이터 집합이 변경 되었음을 신호로 보냅니다 (전체 업데이트 강제 적용).NotifyDataSetChanged – Signals that the data set has changed (forces a full update).

데이터 집합이 변경 된 방식을 정확히 알고 있는 경우 위의 적절 한 메서드를 호출 하 여 가장 효율적인 방법으로 RecyclerView를 새로 고칠 수 있습니다.If you know exactly how your data set has changed, you can call the appropriate methods above to refresh RecyclerView in the most efficient manner. 데이터 집합이 변경 된 방식을 정확 하 게 알 수 없는 경우 NotifyDataSetChanged를 호출할 수 있습니다. RecyclerView는 사용자에 게 표시 되는 모든 보기를 새로 고쳐야 하기 때문에 훨씬 효율적입니다.If you do not know exactly how your data set has changed, you can call NotifyDataSetChanged, which is far less efficient because RecyclerView must refresh all the views that are visible to the user. 이러한 메서드에 대 한 자세한 내용은 RecyclerView를 참조 하세요.For more information about these methods, see RecyclerView.Adapter.

다음 항목인 기본 RecyclerView 예제에서는 위에 설명 된 파트 및 기능의 실제 코드 예제를 보여 주기 위해 예제 앱을 구현 합니다.In the next topic, A Basic RecyclerView Example, an example app is implemented to demonstrate real code examples of the parts and functionality outlined above.