brunch

You can make anything
by writing

C.S.Lewis

by 이승현 Mar 25. 2019

Android Paging Library

Android Jetpack Navigation

#01 RecyclerView


대량의 데이터 중 필요한 데이터만 표시하는 UI를 구현해야 하는 경우가 많습니다.


데이터가 계속해서 업데이트되거나 표시하는 UI 이벤트들로 인해 둘 사이의 sync를 맞추기가 어려워질 수 있습니다.

이는 결국 사용자의 리소스를 낭비하게 됩니다.



필요에 따라 데이터 소스에서 정보를 점진적으로 로드합니다.


Paging Library는 한 번에 필요한 데이터 덩어리(chunck)만 로드(load)하고 표시(display)하는 데 도움을 주는 라이브러리입니다.


이외에도 RecyclerView와 LiveData, RxJava, Room과 결합되어 사용하기 편하게 구성되어 있습니다.


Network에서 데이터를 얻어와 RecyclerView에 표시하는 방법에 대해 알아보겠습니다.




#01 Prerequisites


Android Studio 3.0 or higher

Emulator or device running API 14+

#02 app/build.gradle




#02 DataSource


#03 Data Layer


Base class for loading snapshots of data


Paging library에는 DataSourcePagedList라는 주요 component가 있습니다.


DataSource는 데이터의 snapshot을 로딩하기 위한 기본 클래스입니다.


DataSource에는 3가지 타입이 있습니다.


#02-1 PageKeyedDataSource

페이지의 키 값을 기반으로 페이징을 수행하기 위해 Next/Previous 필드를 가지고 있는 경우 이용합니다.

"items": [     
    {      
         "type": "NEWS",
         ...
    }
],
"next": "next_key_value",
"previous": "previous_key_value"
#04 PageKeyedDataSource


#02-2 ItemKeyedDataSource

페이지 아이템의 키 값을 기반으로 페이징을 수행합니다.

Next/Previous 필드가 없기 때문에 처음/마지막 아이템의 키 값을 이용합니다.

"items": [     
    {      
         "startTime": {
              "key": "2019022309230_ko" // first item key
          }
    }
    ...
    {      
         "startTime": {
              "key": "2019022309230_ko" // first item key
          }
    }
]
#05 ItemKeyedDataSource


#02-3 PositionalDataSource 

페이지 번호나 offset을 이용해서 페이징을 수행합니다.

"items": [     
    {      
         "type": "NEWS",
         ...
    }
]
"count": 20,
"offset": 40,
"limit": 20,
"total": 1100,
#06 PositionalDataSource




#03 DataSource.Factory


DataSource를 생성(create) 하기 위해 DataSource.Factory가 필요합니다.

#07 DataSource.Factory




#04 PagedList


#08 PagedList


PagedList는 DataSource에서 데이터 덩어리(chunck)를 로드하는 Collection입니다.


LiveData<PagedList>를 생성하기 위해서는 LivePagedListBuilder를 이용해야 합니다.

만약 RxJava를 이용한다면 RxPagedListBuilder를 이용해야 합니다.


#08 ViewModel




#05 PagedListAdapter


#09 PagedListAdapter


PagedListAdapter는 PagedList를 이용한 Recyclerview.Adpater입니다.

#10 PagedListAdapter


DiffUtil을 통해 비교 후, 변경된 값이 변한 아이템들만 변경합니다.

이때 비교 연산은 별도의 background 스레드에서 실행되고, 그 결과를 기반으로 main 스레드에서 UI 작업을 하게 됩니다.


#11 Activity







직접 구현하거나 오픈 소스를 이용해야 했던 RecyclerView 페이징을 구글에서 직접 관리해준다는 측면에서 좋아 보입니다.


게다가 ViewModel, LiveData와 쉽게 결합할 수 도 있기에 적용하기도 수월해 보이네요.

브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari