728x90
Recycler view 동작 원리
- Recycler view 의 아답터에 데이터가 300개 있고 화면에 10개의 데이터가 보여진다면, 10개의 데이터 공간을 생성하고, 그 10개의 공간을 재활용해서 300개의 데이터를 보여준다
- 호출 순서
- getItemCount 함수를 이용하여 Item 의 총 갯수가 몇개 인지 판단하고, getItemViewType 이 불리면서, 현재 뷰의 Position에 해당하는 ViewType을 판단한다.
- 이후 onCreateViewHolder에서, ViewType 에 해당하는 ViewHolder를 생성한다.
- onBindViewHolder 에서는 onCreateViewHolder 에서 생성된 ViewHolder 를 가져와서 현재 포지션에 맞는 데이터를 뷰홀더안에 뷰들에게 바인딩해준다.
- 가령 10개의 데이터가 보여진다면, 맨처음에는 getItemCount가 불리고, 그 후 10번 getItemViewType, onCreateViewHolder, onBindViewHolder 가 연속적으로 호출된다.
- 그렇다면 10개의 데이터가 보여진 상황에서 아래로 스크롤 해서 11 번째, 12 번째 데이터들이 보여질때 Recyclerview는 어떤식으로 동작할까?
- 이부분에서 핵심은 Scrapped View 개념 이다
- Scrapped view란, 아직 RecyclerView에는 붙어 있지만, 곧 제거되거나 재사용될 것으로 지정된 ViewHolder 이다
- 아래로 스크롤을 하는 순간 LinearLayoutManager 의 ScrollVerticallyBy 함수가 호출되고, 어떤 ViewHolder를 Scrapped View로 지정할 것인지에 대해서 결정한다
- 그 후에 Recycler 클래스 내의 getViewForPosition 함수가 호출되며 , 현재 LayoutManager 가 배치하고자 하는 View 의 Position 을 파라미터로 받아 Position 에 맞는 View 를 반환해준다 (예를 들어 아래로 스크롤을 하면 눈에 보이는 맨 위에 ViewHolder 가 Scrapped View로 된다)
- 마지막으로 onCreateViewHoler 를 하기 전에, Scarped View Pool 에 현재 ViewType과 같은 ViewHolder가 있으면 그 ViewHolder를 리턴하고 생성하지 않는다. (FIFO 교체 알고리즘과 흡사하다
728x90
'Android > Today I Learned' 카테고리의 다른 글
Android Font 고군분투기 (1) | 2021.12.06 |
---|---|
Coil 로 OnDemand-image-resizing 적용하기 (0) | 2021.11.23 |
Glide cache 제거 하기 (0) | 2021.11.21 |
멀티 모듈에서 Missing required view with ID 에러 해결 (1) | 2021.06.07 |
테스트 케이스로 작성해보는 RxJava 함수 (0) | 2021.02.07 |