android - 如何将两个可变实时数据的结果合二为一

标签 android kotlin android-livedata mutablelivedata

我的 ViewModel 中有两个变量,它们由用户使用按钮控制。他可以通过单击适当的按钮来减少或增加值。

val age = MutableLiveData<Int>().apply { value = 0 }

val weight = MutableLiveData<Double>().apply { value = 0.0 }

现在我只想在两个变量的值都大于 0 时才启用保存按钮。该怎么做?我考虑过在 ViewModel 中创建另一个 LiveData 变量 correctData或者以某种方式在 Activity 中观察年龄和体重变量,但我需要帮助,因为我不知道该怎么做。

谢谢你的帮助。

更新

我创建了 MediatorLiveData,它几乎可以正常工作,几乎是因为它不会检测两个来源是否都提供了真实值,而是检测是否存在任何真实值。

private val _correctData = MediatorLiveData<Boolean>().apply {
        value = false
        addSource(age) { x -> x?.let { value = x > 0 } }
        addSource(repeats) { x -> x?.let { value = x > 0 } }
    }

有什么想法吗?

最佳答案

尝试使用 MediatorLiveData,它旨在将多个 LiveData 合并为一个流 https://developer.android.com/reference/android/arch/lifecycle/MediatorLiveData

由于您要合并两种不同的类型,我建议创建一个新类来保存这些值:

data class AgeAndWeight(val age: Int = 0, val weight: Double = 0.0)

然后创建一个类型为 MediatorLiveData 的变量:

val ageAneWeight = MediatorLiveData<AgeAndWeight>().apply { AgeAndWeight() }

实现合并函数:

fun merge() {
        ageAneWeight.addSource(age) { value ->
            val previous = ageAneWeight.value
            ageAneWeight.value = previous?.copy(age = value)
        }
        ageAneWeight.addSource(weight) { value ->
            val previous = ageAneWeight.value
            ageAneWeight.value = previous?.copy(weight = value)
        }
    }

并观察您的新实时数据:

fun observe() {
    ageAneWeight.observe(this, Observer {
        if (it.age != 0 && it.weight > 0.0) {
            //do whatever you want
        }
    })
}

关于android - 如何将两个可变实时数据的结果合二为一,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57270892/

相关文章:

android - 如何使用 Android SurfaceView 实现每秒 30 帧?

java - 如何在 Android 中发帖?

Android TextView 文本在运行时不更新

java - 如何在本地覆盖特定的Spring bean,而不是允许全局bean定义覆盖?

javascript - 如何配置 create-react-kotlin-app 以使 kotlinx.serialization 正常工作

android - 在 kotlin 中为 ViewModel 编写单元测试用例

android - 更改选择/单击 ListView 项目的背景 - Android

performance - 为什么Gradle构建Kotlin源代码会暂停约3秒 “forcing System.gc()”?

android - 为什么我无法在 lambda 函数下调用 kotlin 挂起函数

java - 为什么要在返回之前将 volatile 分配给局部变量