ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Andorid RecyclerView 이해하기
    Programming/Android 2022. 4. 24. 23:58

    리스트 구현 중에 데이터가 나오지 않아서 삽질하던 중에, LayoutManager가 빠져있었던 어이없는 실수를 뒤늦게 발견했습니다. LayoutManager가 가로 , 세로, 그리드 형식으로 Recyclerview의 모양을 바꿔준다는 것은 잘 알지만, 어떻게 동작하길래 Recyclerview을 안나오게 하는지. 그 원리를 알아봅니다.

     

     

    Recyclerview는 다음과 같은 구성으로 이뤄집니다

    • Adapter - 필요한 Data를 가져오고, View 연결하는 역할을 합니다.
    • ViewHolder - 재활용될 View의 구성요소를 갖는 객체입니다.
    • LayoutManager - layout의 배치/구성을 담당합니다.

    각 요소들이 어떠한 흐름으로 소통하며 RecyclerView를 동작하게 하는지 살펴보겠습니다.

     

     

    1. LayoutManager가 화면을 구성을 위해, 각 포지션에 맞는 View를 Recyclerview에 요청합니다.

    2. Recyclerview는 Cache에 해당 포지션에 View가 있는지 확인하고 전달합니다.

    3. 만약 해당하는 View가 없는 경우, RecyclerView는 Adapter에게 ViewType이 무엇인지 물어봅니다.

    4. Adapter로부터 전달받은 ViewType을 갖는 ViewHolder가 Recyclerd Pool에 있는지 확인합니다.

    5. 만약 Recyclerd Pool에 해당 ViewHolder가 있다면,  Adapter에서 onBindViewHolder 후에, LayoutManager에게 전달하고

    6. 없다면 createViewHolder로 새로 ViewHolder를 생성하여 전달합니다.

     

     

    위 흐름에서도 알 수 있듯이 Recyclerview를 화면에 그리기 위해서는 LayoutManger를 거쳐야만 합니다. 어떻게 구성할지에 대한 계산 후에 RecyclerView에 데이터를 요청하기 때문입니다. LayoutManager 없이 실행된 상태에서, RecyclerView Adapter에 아무리 breakPoint를 달아봤자 걸리지 않는 이유가 바로 이 때문입니다.

     

     


     

     

    RecyclerView의 동작원리

    Recyclerview의 핵심은 자원을 재사용한다는 것에 있습니다. 많은 양의 데이터가 있을 때, 데이터의 수 만큼 View를 생성하는 것이 아니라, 화면에 보이는 만큼의 View를 생성하고 이를 재활용합니다. 이 과정에서 ViewHolder 패턴을 사용합니다. ViewHolder는 이름에서도 유추할 수 있듯 해당 view에 사용되는 요소들을 보관하고 있다가, View가 다시 사용되어야할 때 findViewById로 다시 접근하는 것이 아니라 이미 해당 정보를 갖고 있는 ViewHolder를 사용함으로써 성능 향상에 도움을 줍니다

     

    주요 Method

    onCreateViewHolder()

    - 새로운  ViewHolder를 생성하고 초기화 합니다. 다만 아직 데이터는 연결되지 않은 빈 상태입니다.

    onBindViewHolder()

    - 데이터와 ViewHolder를 연결합니다. 

     

     

    왜 findViewById를 자주 사용하면 성능 문제가 발생하는가

    단일 뷰에 대한 findViewById 사용은 성능에 큰 영향을 미치지 않습니다. 다만 여러 하위 요소를 갖는 복잡한 view에 접근할 때 문제가 발생합니다. 복잡한 view의 경우 모든 하위 view에 대해서 id를 찾는 과정이 이루어지기 때문에 성능 문제가 발생합니다.

     

    ListView?

    RecyclerView 이전의 ListView에서도 데이터 개수만큼의 아이템 생성하는 것이 아니라 화면에 보여지는 만큼만 사용한다는 개념은 Recyclerview와 비슷합니다만,  Recyclerview처럼 View를 재사용하는 것이 아닌, 단순한 삭제 그리고 생성합니다. 그로인해 스크롤링 할때마다 안보이는 View는 삭제 그리고 새로운 View를 생성하면서 findViewById에 대한 성능 문제가 생겼습니다. 이러한 문제를 인지하고 ListView에서는 ViewHolder의 사용을 권장하고 있었지만, RecyclerView에서는 ViewHolder의 구현을 강제하고 있습니다.

     

     

     

    참고자료:

    https://youtu.be/LqBlYJTfLP4

     

Designed by Tistory.