😢
paging3 + HorizontalPagerで途中からページを表示させたい
@Composable
fun ContentScreen(db: AppDatabase, initialPage: Int) {
val pageFlow = remember {
Pager(
config = PagingConfig(
pageSize = ITEMS_PER_PAGE,
enablePlaceholders = false,
initialLoadSize = initialLoadSize
),
initialKey = if(initialPage < initialLoadSize) 0 else min(count-initialLoadSize,initialPage-initialLoadSize/2),
pagingSourceFactory = {
db.pageDao().getPagingSource()
}
).flow
}
val pages = pageFlow.collectAsLazyPagingItems()
val pageState = rememberPagerState(pageCount = { pages.itemCount }, initialPage = if(initialPage < initialLoadSize) initialPage else maxOf(initialLoadSize-(count-initialPage), initialLoadSize/2))
HorizontalPager(
state = pageState,
key=pages.itemKey(),
) { index ->
val scrollState = rememberScrollState()
val page = pages[index]!!
Card(
modifier = Modifier
.fillMaxSize()
.verticalScroll(scrollState)
) {
Column(
modifier = Modifier
.fillMaxWidth()
.padding(dimensionResource(id = R.dimen.padding_small))
) {
Text("(${page.num}/${count}) ${page.title}")
Text(page.content)
}
}
}
paging3で、たとえば101くらいから読み込んだ場合、
101-130に対して、indexが0-29と振られる。
この状態で、ページを戻っていると、途中で71-100が読み込まれ、
71のindexが1となり、101のindexは30となってしまう。
するとどうなるか、HorizontalPagerで現在106ページを見ている。という状況だとindexは5であるので、読み込まれてindexが振りなおされた時点で、突然76ページにジャンプしてしまう。
また、76ページにジャンプすると、当然41-70ページが読み込まれ、また46ページにジャンプする。
というように連鎖的に読み込みとページジャンプがうごいてしまい、先頭付近まで戻されてしまう。
これ、どうしたらいんだろう。
Discussion