我是Jetpack的新手,我花了几个小时来寻找如何更新我的列表中的LazyColumn。我读过它需要一个不可变的列表来更新LazyColumn,但是我似乎无法让它工作。
代码看起来像:
@Composable
fun CreateList() {
var myList : List<DailyItem> by remember { mutableStateOf(listOf())}
myList = getDailyItemList() // Returns a List<DailyItem> with latest values and uses mutable list internally
// Function to refresh the list
val onUpdateClick = {
// Do something that updates the list
...
// Get the updated list to trigger a recompose
myList = getDailyItemList()
}
// Create the lazy column
...
}我尝试过几种方法,或者是当点击更新按钮时列表从未更新过,或者只有第一项被更新,而不是列表中的其余项目。我看了文档,上面写着,但我不明白:
,而不是使用不可观测的可变对象,我们建议您使用一个可观察的数据持有者,例如状态和不可变的listOf()。
如何更新列表以便更新LazyColumn?
发布于 2021-06-19 12:49:27
使用SnapshotStateList,列表是可变的。任何修改(添加,删除,清除,.)到列表中将触发LazyColumn中的更新。
类似于mutableListOf() (对于MutableList),有mutableStateListOf()来创建SnapshotStateList。
扩展函数swapList()只是将clear()和addAll()调用结合起来,用新列表替换旧列表。
fun <T> SnapshotStateList<T>.swapList(newList: List<T>){
clear()
addAll(newList)
}
@Composable
fun CreateList() {
val myList = remember { mutableStateListOf<DailyItem>() }
myList.swapList(getDailyItemList()) // Returns a List<DailyItem> with latest values and uses mutable list internally
// Function to refresh the list
val onUpdateClick = {
// Do something that updates the list
...
// Get the updated list to trigger a recompose
myList.swapList(getDailyItemList())
}
// Create the lazy column
...
}发布于 2021-06-19 16:37:00
参见基本思想是将列表作为状态来处理。现在,您可以使用mutableStateOf(initialValue)了,
好的,这个过程是,。
我们创建一个变量,将其初始化为某事物的可变状态。
然后,我们将该变量赋值给惰性列。没有必要将其分配给列的items参数,但这是我们这里的用例。否则,在包含惰性列的Composable中,您只需键入变量的名称,即使这样做也是可行的,因为我们所需要的就是撰写以获得该变量正在由Composable读取的消息。
回到问题上,
我们创建一个变量,比如val mList: List<Int> by remember { mutableStateOf (listOf()) }
Lazycolumn{
items(items = mList){
Text(it)
}
}
Button(onClick = { mList = mList + listOf(mList.size())})单击该按钮会向列表中添加一个新的数字,这反映在LazyColumn的UI中。
https://stackoverflow.com/questions/68046535
复制相似问题