提问人:Lokesh Chennamchetty 提问时间:10/5/2023 最后编辑:Lokesh Chennamchetty 更新时间:10/5/2023 访问量:122
当列表数据更改时,jetpack compose 中的 LazyColumn 不会重新组合,但 forloop over data list 有效,我不明白为什么以及发生了什么
LazyColumn in jetpack compose does not recompose when list data changes, but forloop over data list works, I am not getting why and what is happening
问:
我正在使用 jetpack compose 开发一个应用程序,我是这个 UI 框架的新手, 我想显示类别 amountSpent 属性。 我正在更改对话框中的花费金额,并希望反映列表中的更改,这里的问题是懒惰列不会重新组合,但类别中的文本可以循环工作。 我不确定为什么 Lazy Column 不起作用,但简单的 forloop 正在工作
var categories = remember {
mutableStateListOf(
Category.FoodCategory(amountSpent=100),
Category.ShoppingCategory(amountSpent=50),
Category.TransportationCategory(amountSpent=80),
Category.EducationCategory(amountSpent=90)
)
}
categories[0].amountSpent=400
@Composable
fun HomeUi(categories: SnapshotStateList<Category>) {
LazyColumn() {
items(categories){
Text(text = it.amountSpent.toString())
}
}
categories.forEach{
Text(text = it.amountSpent.toString())
}
}
我原以为 Lazy Column 和 ForEach 世界的结果是一样的,但令我震惊的是,Lazy Column 不起作用
The Output was
Before
100
50
90
80
100
50
90
80
After Change
100
50
90
80
400
50
90
80
类别代码:
sealed class Category(
val name: String,
val totalBudget:Int,
open var amountSpent: Int,
@DrawableRes val icon : Int){
data class FoodCategory(override var amountSpent: Int=0):
Category("Food",500,amountSpent,R.drawable.ic_food)
class ShoppingCategory(override var amountSpent: Int=0):
Category("Shopping",500,0,R.drawable.ic_shopping)
class TransportationCategory(override var amountSpent: Int=0):
Category("Transportation",500,amountSpent,R.drawable.ic_transportation)
class EducationCategory(override var amountSpent: Int=0):
Category("Education",500,amountSpent,R.drawable.ic_education)
}
编辑修复了问题: 我不得不删除类别表单列表并再次添加它,以便重新编译惰性列,为其分配值不起作用,
请谁能解释一下这是 Jetpack compose 的错误还是我这边的问题?
var categoryChanged = categories.find { cat == it.name }
categoryChanged?.amountSpent = categoryChanged?.amountSpent?.plus(400)!!
var ind = categories.indexOf(categoryChanged)
categories.remove(categoryChanged)
categories.add(ind, categoryChanged!!)
答:
0赞
Dafi
10/5/2023
#1
如果您需要更改列表中的项目位置或更新值,并且想要在 中重构,则必须添加 。LazyColumn
key
LazyColumn {
items(
items = messages,
key = { message ->
// Return a stable + unique key for the item
message.id
}
) { message ->
MessageRow(message)
}
}
评论
0赞
Lokesh Chennamchetty
10/9/2023
请查看我对问题的更新编辑。我修复了它,但想知道您是否对修复有任何反馈
评论
Category