😢

paging3 + HorizontalPagerで途中からページを表示させたい

2024/02/17に公開
@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