Android LiveData 转换:更改 LiveData 对象值
Android LiveData Transformation: Changing LiveData object value
我有一个包含用户列表的 LiveData 对象,我正在尝试将数据传输到另一个 LiveData 对象以在别处使用。
我将 MVVM 与 Room 一起使用,因此我从数据库和 ViewModel 中获取 LiveData,我试图将 LiveData 中的用户对象转换为 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。
谢谢!
val liveList = MutableLiveData(repo.getAll().value.orEmpty().map { user ->
Person(user.firstName, user.age)
})
这将是一种更紧凑的方式,如果您愿意,您可以将 repo.getAll() 调用提取到它自己的变量中
您的代码的主要问题是它在 var liveList: LiveData
中使用 var
而不是使用 val
.
您应该这样声明 liveList
变量:
val liveList = Transformations.map(list2) { list ->
...
}
为什么?
通常,LiveData
变量应始终用 val
声明。原因是 LiveData
的目的是让我们观察 LiveData
持有的最新值。我们通过这样的代码来完成:
liveList.observe(this) { list ->
showList(list)
}
使用此代码,我们确保始终显示更新的列表。每当 liveList
持有的 list
值发生变化时, UI 就会更新。但是如果liveList
本身也发生变化,代码只会观察到liveList
变量的第一个LiveData
,而UI并不会正确更新
]
我有一个包含用户列表的 LiveData 对象,我正在尝试将数据传输到另一个 LiveData 对象以在别处使用。
我将 MVVM 与 Room 一起使用,因此我从数据库和 ViewModel 中获取 LiveData,我试图将 LiveData 中的用户对象转换为 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。
谢谢!
val liveList = MutableLiveData(repo.getAll().value.orEmpty().map { user ->
Person(user.firstName, user.age)
})
这将是一种更紧凑的方式,如果您愿意,您可以将 repo.getAll() 调用提取到它自己的变量中
您的代码的主要问题是它在 var liveList: LiveData
中使用 var
而不是使用 val
.
您应该这样声明 liveList
变量:
val liveList = Transformations.map(list2) { list ->
...
}
为什么?
通常,LiveData
变量应始终用 val
声明。原因是 LiveData
的目的是让我们观察 LiveData
持有的最新值。我们通过这样的代码来完成:
liveList.observe(this) { list ->
showList(list)
}
使用此代码,我们确保始终显示更新的列表。每当 liveList
持有的 list
值发生变化时, UI 就会更新。但是如果liveList
本身也发生变化,代码只会观察到liveList
变量的第一个LiveData
,而UI并不会正确更新