Android Basic

리사이클러뷰 RecyclerView Deep Dive

hik14 2024. 9. 25. 04:10

RecyclerView

- 안드로이드 ViewSystem에서 상대적으로 많은 양의 데이터를 사용자에게 보여주기 위해 스크롤 가능한 뷰이다.

- RecyclerView는 ViewHolder의 도움으로 제공되는 데이터 컬렉션에 대한 List를 생성하여 화면에 사용자에게 그리는 ViewGroup

- 무엇을 재활용 하는가???  "ViewHolder"

 

RecyclerView의 구성요소들

LayoutManager

-  RecyclerView 내에서 항목 뷰를 측정하고 배치한다. 새로운 아이템을 배치해야 하며 이를 위해 position을 사용

- LayoutManager를 변경하면 RecyclerView를 사용하여 표준 수직 스크롤 목록, 균일한 그리드, 계단형 그리드, 수평 스크롤 컬렉션 등을 구현할 수 있습니다. 

- 더 이상 사용자에게 표시되지 않는 항목 뷰를 재활용할 시기의 정책을 결정하는 역할을 합니다. 

Adapter에 새로운 ViewHolder를 생성할 시기를 알려주는 recyclerView의 관리 기관


Adapter

- 데이터 컬렉션에서 RecyclerView로 보여지는 View로의 바인딩을 제공

public abstract VH onCreateViewHolder(@NonNull ViewGroup parent, int viewType);

 

새로운 ViewHolder가 필요할때 ViewHolder 생성을 위해 호출, View Type의 View를 보유하는 ViewHolder생성

public abstract void onBindViewHolder(@NonNull VH holder, int position);

 

ViewHolder의 View에 데이터를 바인딩 해주는 함수

 

 

 

ViewHolder

- 화면에 그리려는 개별 항목의 UI를 그리는 데 도움이 되는 일종의 도우미 클래스입니다.

- ViewHolder는 item View와 RecyclerView 내 해당 item View 위치에 대한 메타 데이터를 설명합니다.

 

Adapter 구현할때, ViewHolder를 종속된 클래스화하고 잠재적으로 비용이 많이 드는 findViewById 결과를 캐싱하기 위한 필드를 추가해야 합니다.

LayoutParams는 LayoutManager에 속하지만 ViewHolder는 Adapter에 속합니다.

Adapter는 개발자가 커스텀한 자체 사용자 지정 ViewHolder 구현을 사용하여 뷰 콘텐츠 바인딩을 더 쉽게 만드는 데이터를 저장해야 합니다. 

 

구현할때, 개별 Item View가 ViewHolder 객체에 대한 강력한 참조를 보유할 수 있고, RecyclerView 인스턴스가 캐싱 목적으로 추가 오프스크린 항목 뷰에 대한 강력한 참조를 보유할 수 있다고 가정해서 주의해야 합니다

 

* 데이터가 보여지는 흐름도

RecyclerView의 작동 과정

총 50개의 data collection 항목이 있고, 화면에는 5개만 표시된다고 가정해보자.

아래 그림처럼, 화면에는 5개의 아이템이 보이고 item x 와 item 6는  각각 위로 또는 아래로 스크롤할때 보여질 아이템들이다.

 

 

 

1. item x - item 4는 최초 실행 시 화면에 보인다. 이를 Visible View라 하자! 그리고 item 5는 화면을 위로 스크롤할 때 로드될 새 항목입니다. 

 

2. 위의 항목 하나를 스크롤하면 item x가 위로 이동하고 새 항목인 item 5가 화면에 표시됩니다.(위 그림과 같은 상태)

이제 item 6이 대기 보기에 있습니다. 여기서 item x는 화면 상단의 보이는 보기에서 벗어났습니다. 이를 ScrapView 라고 합니다.

 

* ScrapView는 RecyclerView의 뷰로, 한때는 사용자의 화면에 표시되었으나, 현재는 화면에서 사용자에게 표시되지 않는 뷰.

 

3. 이제 한 단계 더 위로 스크롤했다고 가정해 보자, 그러면 항목 1이 화면에서 벗어나고 item 6이 안으로 이동합니다.
item 1도 ScrapView가 됩니다. 이제 두 개의 ScrapView인 item x와 item 1이 있습니다.

 

ScrapView Collection 에 저장됩니다.
따라서 이제 표시된 뷰 그룹에서 새 뷰를 로드해야 할 때 item 7을 생각해보자! 그러면 ScrapViewCollection에서 뷰가 사용됩니다.

4. item 7 을 로드할 때, ScrapView Collection에서 뷰를 가져옵니다. ScrapView에서 재로드한 뷰를 Dirty View라고 합니다.
이제 Dirty View가 재활용되어 화면에 표시되어야 하는 큐의 새 항목, 즉  item 7 으로 재배치됩니다.

Dirty View - ScrapView Collection에서 가져온 뷰를 다시 바인딩한 후 화면에 그리기 전에 recyclerView 어댑터에서 다시 바인딩한 뷰. 

 

 

RecyclerView가 최초 화면에 보여질때,

 

onCreateViewHolder()

onBindViewHolder()

------------------------
onCreateViewHolder()

onBindViewHolder()

------------------------
onCreateViewHolder()

onBindViewHolder()

------------------------
onCreateViewHolder()

onBindViewHolder()

------------------------

이렇게 번갈가면서 호출된다. 기본적으로 10개의 ViewHolder를 생성한다.

 

이후 항목을 스크롤 하면 onBindViewHolder()가 대부분 호출이 되고, 필요할때만, onCreateViewHolder()이 호출된다.

 

주의점.

* onBindViewHolder()

View에 Listener를 달면 안되는 이유.

- 호출될때 마다 Listener 객체를 지속적으로 생성해서 넣어줌. 

- onCreateViewHolder()에서 생성할때 달아준다.

 

 

https://developer.android.com/reference/androidx/recyclerview/widget/RecyclerView