개발일지

Android in A..Z - Paging3 (PagingSource) 본문

Android (안드로이드)/Paging

Android in A..Z - Paging3 (PagingSource)

강태종 2021. 5. 25. 01:11

PagingSource

PagingSource는 데이터 소스를 얻는 방법을 정의하고 로컬 데이터 베이스에서 얻거나 서버로 부터 데이터를 얻을지 정의할 수 있다.

PagingSource<Key, Value>에서 Key값은 Page의 Key 유형이고 Value는 얻는 데이터의 유형입니다.


코드

package com.taetae98.paging.paging

import androidx.paging.PagingSource
import androidx.paging.PagingState
import com.taetae98.paging.dto.WebToon

class ViewerPagingSource(
        private val webToon: WebToon,
        private val episode: Int
) : PagingSource<Int, String>() {
    override fun getRefreshKey(state: PagingState<Int, String>): Int? {
        // Try to find the page key of the closest page to anchorPosition, from
        // either the prevKey or the nextKey, but you need to handle nullability
        // here:
        //  * prevKey == null -> anchorPage is the first page.
        //  * nextKey == null -> anchorPage is the last page.
        //  * both prevKey and nextKey null -> anchorPage is the initial page, so
        //    just return null.
        return state.anchorPosition?.let { anchorPosition ->
            val anchorPage = state.closestPageToPosition(anchorPosition)
            anchorPage?.prevKey?.plus(1) ?: anchorPage?.nextKey?.minus(1)
        }
    }

    override suspend fun load(params: LoadParams<Int>): LoadResult<Int, String> {
        return try {
            val page = (params.key ?: episode - 1)

            LoadResult.Page(webToon.episodeList[page].imageList, null, if (page == webToon.episodeList.size) null else page + 1)
        } catch (e: Exception) {
            LoadResult.Error(Throwable("Paging Error"))
        }
    }
}

load

실제로 데이터를 어떻게 얻을지 정의하는 부분입니다.

LoadParams에는 Data를 Load할 정보를 저장합니다. 현재 Load할 Page의 Ke와 항목의 수가 포합됩니다. (LoadParams에 PageKey가 없으면 첫번째 페이지를 로드하면 됩니다.)

 

데이터 로드를 성공하면 LoadResult.Page를 반환하고 실패하면 LoadResult.Error를 반환합니다. LoadResult.Page에는 데이터와 previousKey, nextKey로 생성하는데 previousKey는 Paging에서 정하기 때문에 null를 전달하고 next 현재 페이지 기준으로 다음 페이지의 Key값을 전달합니다.

 


getRefreshKey()

LoadParams에 PageKey를 전달할 때 사용하는 함수다. previousKey가 null이면 첫번째 페이지를 반환하고 nextKey가 null이면 마지막 페이지를 반환한다. 만약 둘 다 null이면 null을 반환한다.


Git (예제코드)

https://github.com/KangTaeJong98/Example/tree/main/Android/Paging

 

KangTaeJong98/Example

My Example Code. Contribute to KangTaeJong98/Example development by creating an account on GitHub.

github.com

 

Comments