Android Jetpack Navigation
대량의 데이터 중 필요한 데이터만 표시하는 UI를 구현해야 하는 경우가 많습니다.
데이터가 계속해서 업데이트되거나 표시하는 UI 이벤트들로 인해 둘 사이의 sync를 맞추기가 어려워질 수 있습니다.
이는 결국 사용자의 리소스를 낭비하게 됩니다.
필요에 따라 데이터 소스에서 정보를 점진적으로 로드합니다.
Paging Library는 한 번에 필요한 데이터 덩어리(chunck)만 로드(load)하고 표시(display)하는 데 도움을 주는 라이브러리입니다.
이외에도 RecyclerView와 LiveData, RxJava, Room과 결합되어 사용하기 편하게 구성되어 있습니다.
Network에서 데이터를 얻어와 RecyclerView에 표시하는 방법에 대해 알아보겠습니다.
Android Studio 3.0 or higher
Emulator or device running API 14+
Base class for loading snapshots of data
Paging library에는 DataSource와 PagedList라는 주요 component가 있습니다.
DataSource는 데이터의 snapshot을 로딩하기 위한 기본 클래스입니다.
DataSource에는 3가지 타입이 있습니다.
페이지의 키 값을 기반으로 페이징을 수행하기 위해 Next/Previous 필드를 가지고 있는 경우 이용합니다.
"items": [
{
"type": "NEWS",
...
}
],
"next": "next_key_value",
"previous": "previous_key_value"
페이지 아이템의 키 값을 기반으로 페이징을 수행합니다.
Next/Previous 필드가 없기 때문에 처음/마지막 아이템의 키 값을 이용합니다.
"items": [
{
"startTime": {
"key": "2019022309230_ko" // first item key
}
}
...
{
"startTime": {
"key": "2019022309230_ko" // first item key
}
}
]
페이지 번호나 offset을 이용해서 페이징을 수행합니다.
"items": [
{
"type": "NEWS",
...
}
]
"count": 20,
"offset": 40,
"limit": 20,
"total": 1100,
DataSource를 생성(create) 하기 위해 DataSource.Factory가 필요합니다.
PagedList는 DataSource에서 데이터 덩어리(chunck)를 로드하는 Collection입니다.
LiveData<PagedList>를 생성하기 위해서는 LivePagedListBuilder를 이용해야 합니다.
만약 RxJava를 이용한다면 RxPagedListBuilder를 이용해야 합니다.
PagedListAdapter는 PagedList를 이용한 Recyclerview.Adpater입니다.
DiffUtil을 통해 비교 후, 변경된 값이 변한 아이템들만 변경합니다.
이때 비교 연산은 별도의 background 스레드에서 실행되고, 그 결과를 기반으로 main 스레드에서 UI 작업을 하게 됩니다.
직접 구현하거나 오픈 소스를 이용해야 했던 RecyclerView 페이징을 구글에서 직접 관리해준다는 측면에서 좋아 보입니다.
게다가 ViewModel, LiveData와 쉽게 결합할 수 도 있기에 적용하기도 수월해 보이네요.