You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

HorizontalPager无限重组问题求助及替代方案咨询

HorizontalPager切换标签页后无限重组问题求助

我的布局结构伪代码如下:

Column {
   TabsRow {
      ScrollableTabsRow{}
   }
   HorizontalPager {
      Column {
         SubCategories { ScrollableHorizontalTabsRow or LazyHorizontalStaggeredGrid() }
         ProductsContent { LazyColumn {} } 
      } 
   }
}

简单来说就是三层结构:

  • 顶部分类标签栏(单行)
  • 子分类栏(单行或多行)
  • 商品列表

具体Composable实现代码:

@Composable
fun ComposableContent() {
  val categories = state.categories
    val pagerState = rememberPagerState(
        initialPage = initialPage
    )

    BaseCategoriesTabRow(
        state = pagerState,
        categories = categories,
    )

    Spacer(
        modifier = Modifier
            .height(10.dp)
            .fillMaxWidth()
            .background(Color.White)
    )

    HorizontalPager(
        state = pagerState,
        pageCount = categories.size
    ) { page ->
        val listState = rememberLazyListState()
        val isSelected = pagerState.currentPage == page
        categories.getOrNull(pagerState.currentPage)?.let { categoryItem ->
            val showItemsInOneRow = remember {
                derivedStateOf {
                    listState.firstVisibleItemIndex > 1 || categoryItem.subCategories.size < SUBCATEGORIES_ROW_TWO_MIN
                }
            }
                Log.d("horizontalagertest", "PAGE: ${page} + CURRENTPAGE: ${pagerState.currentPage}")
      //      if (isSelected) { -> 我用来抑制过度重组的临时方案
                Column {
                    if (categoryItem.subCategories.size > 1) {
                        SubCategoriesTabRow(
                            state = listState,
                            showItemsInOneRow = showItemsInOneRow.value,
                            events = events,
                            category = categoryItem,
                            rows = constRowQuantity,
                            initialSubCategoryId = initialSubCategoryId
                        ) {
                            events.invoke(CategoryEvent.InitialSubcategoryHandled)
                        }
                       }
               //     }

切换HorizontalPager标签页后,出现无限重组的情况,日志输出如下:

PAGE: 5, CURRENTPAGE: 5
PAGE: 6, CURRENTPAGE: 5
PAGE: 4, CURRENTPAGE: 5
PAGE: 6, CURRENTPAGE: 5
PAGE: 5, CURRENTPAGE: 5
PAGE: 4, CURRENTPAGE: 5
PAGE: 5, CURRENTPAGE: 5
PAGE: 6, CURRENTPAGE: 5
PAGE: 4, CURRENTPAGE: 5
PAGE: 6, CURRENTPAGE: 5
PAGE: 5, CURRENTPAGE: 5
PAGE: 4, CURRENTPAGE: 5

我试过用currentPage代替page,配合isSelected布尔值做判断,但会破坏页面切换动画。最初用的是accompanist库,后来迁移到最新版compose foundation 1.6.0,问题依然存在。希望能得到解决建议或替代组件方案。

内容的提问来源于stack exchange,提问作者user21300258

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 04:35:12