Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- Coroutine
- recyclerview
- onLayout
- CollapsingToolbarLayout
- Android
- 알림
- hilt
- ViewModel
- Algorithm
- 안드로이드
- BOJ
- notification
- 코틀린
- 알고리즘
- room
- Behavior
- onMeasure
- HTTP
- CoordinatorLayout
- 백준
- DataBinding
- sqlite
- CustomView
- activity
- Navigation
- AppBarLayout
- View
- kotlin
- lifecycle
- LiveData
Archives
- Today
- Total
개발일지
Android in A..Z - Paging3 (PagingSource) 본문
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
'Android (안드로이드) > Paging' 카테고리의 다른 글
Android in A..Z - Paging (PagingAdapter) (0) | 2021.05.25 |
---|---|
Android in A..Z - Paging3 (Pager) (0) | 2021.05.25 |
Android in A..Z - Paging3 (개념) (0) | 2021.05.25 |
Comments