如何在 Jetpack Compose 中创建无尽的寻呼机

问题描述 投票:0回答:1
    Box(
        modifier = Modifier.size(100.dp),
        contentAlignment = Alignment.Center
    ) {
        val pagerState = rememberPagerState()
        val items = listOf("A", "B", "C")
        androidx.compose.foundation.pager.HorizontalPager(
            state = pagerState,
            pageCount = items.size,
            modifier = Modifier,
            verticalAlignment = Alignment.CenterVertically
        ) { page ->
            Text(
                text = items[page],
                modifier = Modifier
            )
        }
    }

在上面的代码中,寻呼机在到达最后一项后停止滚动。但是,我希望寻呼机在到达最后一项后继续无限滚动。

android android-viewpager android-jetpack-compose
1个回答
8
投票

您可以通过将 pageCount 设置为 Int.MAX_VALUE 并获取当前页面的模数来获取项目列表的索引来创建它。

@Preview
@Composable
private fun Test() {

    val pageCount = Int.MAX_VALUE
    val items = listOf("A", "B", "C")
    val pagerState = rememberPagerState(
        initialPage = pageCount / 2
    )

    HorizontalPager(
        modifier = Modifier.fillMaxWidth(),
        pageCount = pageCount,
        state = pagerState
    ) {
         Text(text = items[it % 3])
    }
}

编辑

从 Compose 版本 1.6.0 开始

Int.MAX_VALUE(2147483647)
会导致寻呼机出现 ANR,为了防止这种情况,请添加一个大数字但小于 2147483647,这样用户就不会费心滚动那么远。

@Preview
@Composable
private fun InfinitePagerSample() {
Int.MAX_VALUE
    Column(
        modifier = Modifier
            .fillMaxSize()
            .padding(16.dp)
            .border(2.dp, Color.Red)
    ) {

        val items = remember {
            listOf("A", "B", "C")
        }
        val pageCount = items.size * 400

        val pagerState = rememberPagerState(
            initialPage = pageCount / 2,
            pageCount = {
                pageCount
            }
        )

        HorizontalPager(
            modifier = Modifier.fillMaxWidth(),
            state = pagerState,
            beyondBoundsPageCount = 1
        ) {

            val color = if (it % items.size == 0) {
                Color.Red
            } else if (it % items.size != 1) {
                Color.Yellow
            } else Color.Green

            Column(modifier = Modifier.fillMaxSize().background(color)) {
                SideEffect {
                    println("Page $it, composing...")
                }

                Text(text = items[it % 3], modifier = Modifier.fillMaxSize(), fontSize = 70.sp)

            }
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.