android - Android LiveData 转换:更改 LiveData 对象值
问题描述
我有一个包含用户列表的 LiveData 对象,我正在尝试将数据传输到另一个 LiveData 对象以在其他地方使用。
我将 MVVM 与 Room 一起使用,因此我从数据库和 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
视图模型:
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。
谢谢!
解决方案
您的代码的主要问题是它使用var
invar liveList: LiveData
而不是 using val
。
您应该liveList
像这样声明变量:
val liveList = Transformations.map(list2) { list ->
...
}
为什么?
通常,LiveData
变量应始终使用val
. 原因是 的目的LiveData
是让我们观察LiveData
. 我们通过这样的代码来做到这一点:
liveList.observe(this) { list ->
showList(list)
}
使用此代码,我们确保始终显示更新的列表。每当list
保存的值liveList
发生变化时,UI 都会随之更新。但如果liveList
自身也发生变化,代码只会观察到LiveData
变量的第一个liveList
,UI 不会正确更新。
推荐阅读
- c# - Can't use constants to define Dictionary keys?
- android - java.lang.OutOfMemoryError 在 viewFlipper 中显示图像列表时
- c - 交易前后的sqlite差异
- c - 使用 DMA 打印给定值
- spartacus-storefront - `slotShared 属性的作用是什么?
- ios - navigationController.pushViewController 似乎在 Xcode 11 中不起作用?
- laravel - Laravel Vue Axios - Axios DELETE 请求变为 GET 请求
- swift - UIprogressview 栏根据进度和条件使用多种颜色
- cmusphinx - cmusphinx 结果的括号是什么意思?
- php - 带有vuejs的wordpress如何链接到网站页面