Android LiveData转换: Changing LiveData object value

标签 android kotlin android-livedata android-jetpack

我有一个 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

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。

谢谢!

最佳答案

您的代码的主要问题是它在 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 将无法正确更新.

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

相关文章:

Android Timber 多次记录

android - Google map 首次在我的 Android 应用程序上无法加载

Android 简单的微调器项目

java - Android/Java 开发 : How to change TextView text, 使用 Java,在 strings.xml 中预定义字符串?

android - 协程中的 Job.Cancel 与 Scope.Cancel 有什么区别?

Spring(kotlin) Controller 接收数据类的不可为空的参数为空

c# - 将 Lambda 函数传递给 Xamarin.Android 绑定(bind)库中的 Kotlin 的 C# 生成代码

java - 在 AspectJ 上加入切入点

安卓喷气背包 : RecyclerView is not updating when LiveData is set

android - 如何设置 LiveData 以根据多个参数执行搜索?