LazyColumn 比垂直滚动的 Column 慢

Posted

技术标签:

【中文标题】LazyColumn 比垂直滚动的 Column 慢【英文标题】:LazyColumn is slower than Column with vertical scroll 【发布时间】:2021-12-19 16:44:07 【问题描述】:

我有想要在列表中显示的产品单元格,我使用了 LazyColumn 但性能很糟糕,我找不到它为什么这么慢。然后我将 LazyColumn 切换到 Column 并且所有突然的滚动都超级流畅

LazyColumn 版本:

LazyColumn() 
    items(cartItems, key = it.cartItem.id)  cartItemData ->
        CartItemWithActions(data = cartItemData)
        Divider(color = colorResource(id = R.color.separator_line))
    

 

列版本

val state = rememberScrollState()
Column(modifier = Modifier.verticalScroll(state)) 
    cartItems.forEach  cartItemData ->
        CartItemWithActions(data = cartItemData)
        Divider(color = colorResource(id = R.color.separator_line))
    

CartItemWithActions 是我的产品单元格,其中包含我正在使用 glide 和几个文本加载的图像

LazyColumn 版本的 HWUI

列的 HWUI

谁能提供提示为什么 LazyColumn 比 Column 慢?

更新

以这种方式设置 LazyColumn 时,LazyColumn 滚动效果似乎更好

LazyColumn() 
    items(
        count = cartItems.size,
        key = 
            cartItems[it].cartItem.id
        ,
        itemContent =  index ->
            val cartItemData = cartItems[index]
            CartItemWithActions(data = cartItemData)
            Divider(
                color = colorResource(id =R.color.separator_line)
            )
        
    )

【问题讨论】:

尝试在发布版本中运行它 我试过没用 我也亲身体验过,但是每次应用启动时,连续随机滚动五秒后,它似乎就消失了 这不会发生在像 Text 这样简单的东西上,但是对于大量的自定义 Composables,这对我来说似乎也是一个问题。 @MARSK 是的,简单的布局没问题 【参考方案1】:

似乎以这种方式初始化 LazyColumn 解决了我的问题

LazyColumn() 
    items(
        count = cartItems.size,
        key = 
            cartItems[it].cartItem.id
        ,
        itemContent =  index ->
            val cartItemData = cartItems[index]
            CartItemWithActions(data = cartItemData)
            Divider(
                color = colorResource(id =R.color.separator_line)
            )
        
    )

但我还是不知道为什么

【讨论】:

它工作得更好,因为使用 key 参数使 Jetpack Compose 具有与 RecyclerView 中的 DiffUtil 类似的功能。

以上是关于LazyColumn 比垂直滚动的 Column 慢的主要内容,如果未能解决你的问题,请参考以下文章

Kotlin Compose 列表 手动控制列表。给Column添加滚动能力 LazyColumn动画滚动到底部

修复了 Jetpack Compose 中 LazyColumn 内的网格?

Jetpack Compose - 恢复 LazyColumn 滚动状态

删除 Jetpack Compose 中的 LazyColumn 过度滚动效果

如何在 Jetpack Compose 的 LazyColumn/LazyRow 中禁用和启用滚动?

Jetpack Compose LazyColumn 以编程方式滚动到项目