gpt4 book ai didi

Android LiveData 转换 : Changing LiveData object value

转载 作者:行者123 更新时间:2023-12-02 13:30:47 28 4
gpt4 key购买 nike

我有一个包含用户列表的 LiveData 对象,我正在尝试将数据传输到另一个 LiveData 对象以在其他地方使用。

我在 Room 中使用 MVVM,所以我从数据库和 ViewModel 中获取 LiveData,我试图将 LiveData 中的 User 对象转换为 Person 对象以显示在 UI 中。

所以我有一个变量是 LiveData<List<User>>

class User(var firstName: String, var lastName: String, var age: Integer)

我正在尝试将其转换为 LiveData<List<Person>> (举个例子)
class Person() {

lateinit var firstName: String

lateinit var age: Integer
}

我试图改变它们的方式是使用 LiveData Transformations.map

View 模型:
val list2: LiveData<List<User>> = repo.getAll()
var liveList: LiveData<ArrayList<Person>> = MutableLiveData()
liveList = Transformations.map(list2) { list ->
val newList: ArrayList<Person> = ArrayList()
list?.forEach {
val temp = Person()
temp.firstName = it.firstName
temp.age = it.age
newList.add(temp)
}
return@map newList
}

但是当我运行它时,它会崩溃或不更新 UI。

谢谢!

最佳答案

您的代码的主要问题是它使用 varvar liveList: LiveData而不是使用 val .

您应该声明 liveList像这样的变量:

val liveList = Transformations.map(list2) { list ->
...
}

为什么?

通常,一个 LiveData变量应该总是用 val 声明.原因是 LiveData的目的是为了让我们观察 LiveData 持有的最新值.我们通过这样的代码来做到这一点:
liveList.observe(this) { list ->
showList(list)
}

使用此代码,我们确保始终显示更新的列表。每当 listliveList 持有的值更改,结果 UI 会更新。但是如果 liveList本身也有变化,代码只会观察第一个 LiveDataliveList变量,UI 将不会正确更新。

关于Android LiveData 转换 : Changing LiveData object value,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61533937/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com