当前位置: 首页 > 知识库问答 >
问题:

喷气背包组合 - 恢复懒惰列滚动状态

乐正嘉瑞
2023-03-14

我有一个包含多个< code>LazyRow的< code>LazyColumn。在旧术语中,嵌套RecyclerView。

我的问题是,当移动到一个新的可组合(不同的选项卡)时,LazyCol列不会恢复滚动状态。但是内部LazyRows恢复它们的状态。

例如,打开主屏幕,滚动到底部,然后滚动LazyRow结束,然后打开不同的选项卡并再次返回主选项卡。LazyCol(不恢复状态)从顶部开始,但最后一个LazyRow恢复其滚动状态。

包含 LazyColumn 的主屏幕

@Composable
fun HomeScreen(
    homeViewModel: HomeViewModel = hiltViewModel()
) {

    val scrollState = rememberLazyListState()

    LazyColumn(contentPadding = PaddingValues(vertical = 8.dp),
        horizontalAlignment = Alignment.Start,
        verticalArrangement = Arrangement.spacedBy(8.dp),
        state = scrollState,
        modifier = Modifier
            .fillMaxSize()
            .background(MaterialTheme.colors.background)
    ) {
        items(5) {
            TopRatedProducts(homeViewModel = homeViewModel)
        }
    }
}

对包含< code>LazyRow的产品进行评级

@Composable
fun TopRatedProducts(
    homeViewModel: HomeViewModel = hiltViewModel()
) {
    val topRatedProducts by rememberFlowWithLifecycle(homeViewModel.topRatedProducts)
        .collectAsState(initial = emptyList())

    LazyRow(
        contentPadding = PaddingValues(horizontal = 8.dp), // Space between start and end
        verticalAlignment = Alignment.CenterVertically,
        horizontalArrangement = Arrangement.spacedBy(8.dp), // Space between items
        modifier = Modifier
            .background(Color.Green)
    ) {
        items(topRatedProducts) {
            ProductCardItem(item = it)
        }
    }
}

如何恢复懒散列滚动状态?

共有2个答案

西门骁
2023-03-14

在<code>主屏幕()函数的末尾尝试以下操作:

    LaunchedEffect(scrollState.firstVisibleItemScrollOffset) {
        scrollState.scrollToItem(
            scrollState.firstVisibleItemIndex,
            scrollState.firstVisibleItemScrollOffset
        )
    }
龙晟睿
2023-03-14

当您希望在片段中使用ComposeView时,应该提到ViewCompositionStrategy。

override fun onCreateView(
    inflater: LayoutInflater, container: ViewGroup?,
    savedInstanceState: Bundle?
): View? {
    return ComposeView(requireContext()).apply {
        // Dispose the Composition when viewLifecycleOwner is destroyed
        setViewCompositionStrategy(
            ViewCompositionStrategy.DisposeOnLifecycleDestroyed(viewLifecycleOwner)
        )
        setContent {
            // content
        }
    }
}

来自文档:默认情况下,每当视图与窗口分离时,Compose 都会释放合成。ComposeView 和 AbstractComposeView 等“编写 UI 视图”类型使用定义此行为的 ViewCompositionStrategy。

默认情况下,Compose使用DisposeOnDetachedFromWindow策略。但是,在某些情况下,当在以下情况中使用撰写UI视图类型时,可能不需要此默认值:

> 片段。组合必须遵循片段的视图生命周期,以便组合UI视图类型来保存状态。

过渡。只要将Compose UI视图用作转换的一部分,它就会在转换开始时而不是转换结束时从其窗口分离,从而使您的composable在其仍在屏幕上时处理其状态。

RecyclerView 视图持有者,或您自己的生命周期管理的自定义视图

文档链接: https://developer.android.com/jetpack/compose/interop/interop-apis#composition-strategy

 类似资料:
  • 如何从下方显示惰性列?默认情况下,它显示上面的列表

  • 我是jetpack compose的新手,从< code>JetpackCompose基础代码中学习它,所以我在创建一个高性能的懒惰列表中找到了它 注意:LazyColumn不会像那样回收其子项。当您滚动浏览它时,它会发出新的,并且仍然具有高性能,因为与实例化Android视图相比,发出相对便宜。 因此,发出新的可组合项是多么的便宜和高效,那么为什么不使用列并一次性组合整个列表,而不是在滚动时不断

  • 几天来,我一直试图成功地构建我正在进行的项目(使用Jetpack Compose),但当我更新gradle构建插件和其他一些依赖项时,我无法正确运行该项目。有一些gradle版本与dagger-hilt依赖项冲突,我不知道如何修复它。我正在使用Android Studio的金丝雀测试版。 这里还有我所有的gradle构建文件: Gradle构建模块应用程序: Gradle构建(项目层级): 错误:

  • 我想知道什么是喷气背包中的脚手架组成一个BottomAppBar示例任何人都可以帮我

  • 可以在Jetpack Compose中进行权重吗?例如,我想以这样一种方式设置它,即一个项目被加权为布局的1/3,而另一个占剩余的2/3。 在XML/ViewGroup样式中,可以使用LinearLayouts和ConstraintLayouts来实现这一点。然而,令我沮丧的是,使用Jetpack Compose似乎是不可能的。 示例: 在ConstraintLayout中,这是按如下方式完成的:

  • 我想根据条件更改我的开始导航片段。我的起始片段可以是片段1或片段2。有没有办法实现它?