懒加载列(LazyColumn)在垂直滚动方面比普通列(Column)要慢。

22

我有一个产品单元格,希望在列表中显示。我使用了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

适用于Column的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)
            )
        }
    )
}

1
尝试以发布版本的构建方式运行它。 - Richard Onslow Roper
1
我已经尝试过了,它没有帮助。 - Maciej Przybylski
2
我个人也有过这种经历,但在每次应用程序启动后连续随机滚动五秒钟后,它似乎会消失。 - Richard Onslow Roper
3
对于简单的东西,比如Text,不会出现这种情况,但是对于定制化较强的组合部件,我也觉得这是一个问题。 - Richard Onslow Roper
1
不要庆祝。 - Richard Onslow Roper
显示剩余10条评论
2个回答

9

看起来用这种方式初始化 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)
            )
        }
    )
}

但是我仍然不知道为什么


1
它的效果更好,因为使用关键参数使得Jetpack Compose具有类似于RecyclerView中DiffUtil的强大功能。 - Mattia Ferigutti
6
不适用于Compose 1.2.0,表现相同的迟缓行为。 - isudansh
1
@isudansh 我也是。 - thebluepandabear
2
现在慢速行为问题解决了吗? - Jeff Bootsholz
3
我仍然看到卡顿的表现。 - HBB20
@HBB20 我也遇到了同样的问题。LazyColumn非常卡顿。这是否与Compose版本有关?降级版本是否有效? - mrzbn

3

这个问题很奇怪,没有人谈论过它。普通列比惰性列快5倍,并且更加流畅。问题是在普通列加载数据时,屏幕会冻结大约2秒钟才能看到50张卡片,但之后不会再有任何冻结或减速等现象。


这并没有真正回答问题。如果您有不同的问题,可以通过点击提问来提出。如果您想在此问题获得新的答案时得到通知,您可以关注此问题。一旦您拥有足够的声望,您还可以添加悬赏以吸引更多关注。- 来自审核 - Saurabh Bhandari

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接