首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >LazyColumn和可变列表-如何更新?

LazyColumn和可变列表-如何更新?
EN

Stack Overflow用户
提问于 2021-06-19 11:55:53
回答 2查看 8.9K关注 0票数 12

我是Jetpack的新手,我花了几个小时来寻找如何更新我的列表中的LazyColumn。我读过它需要一个不可变的列表来更新LazyColumn,但是我似乎无法让它工作。

代码看起来像:

代码语言:javascript
复制
@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?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-06-19 12:49:27

使用SnapshotStateList,列表是可变的。任何修改(添加,删除,清除,.)到列表中将触发LazyColumn中的更新。

类似于mutableListOf() (对于MutableList),有mutableStateListOf()来创建SnapshotStateList

扩展函数swapList()只是将clear()addAll()调用结合起来,用新列表替换旧列表。

代码语言:javascript
复制
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
    ...
}
票数 18
EN

Stack Overflow用户

发布于 2021-06-19 16:37:00

参见基本思想是将列表作为状态来处理。现在,您可以使用mutableStateOf(initialValue)了,

好的,这个过程是,。

我们创建一个变量,将其初始化为某事物的可变状态。

然后,我们将该变量赋值给惰性列。没有必要将其分配给列的items参数,但这是我们这里的用例。否则,在包含惰性列的Composable中,您只需键入变量的名称,即使这样做也是可行的,因为我们所需要的就是撰写以获得该变量正在由Composable读取的消息。

回到问题上,

我们创建一个变量,比如val mList: List<Int> by remember { mutableStateOf (listOf()) }

代码语言:javascript
复制
Lazycolumn{
items(items = mList){
Text(it)
}
}

Button(onClick = { mList = mList + listOf(mList.size())})

单击该按钮会向列表中添加一个新的数字,这反映在LazyColumn的UI中。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68046535

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档