如何将两个可变实时数据的结果合二为一
How to get result of two mutablelivedata into one
我的 ViewModel 中有两个变量,它们由用户使用按钮控制。他可以通过单击适当的按钮来减少或增加值。
val age = MutableLiveData<Int>().apply { value = 0 }
val weight = MutableLiveData<Double>().apply { value = 0.0 }
现在我只想在两个变量的值都大于 0 时才启用保存按钮。该怎么做?我考虑过在 ViewModel correctData
中创建另一个 LiveData 变量或以某种方式在 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
由于您要合并两种不同的类型,我建议创建一个新的 class 来保存这些值:
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
}
})
}
使用另外 2 个布尔变量来跟踪 LiveData
是否都返回 true。
private val _correctData = MediatorLiveData<Boolean>().apply {
var weightFlag = false
var ageFlag = false
value = false
addSource(age) { x -> x?.let {
ageFlag = x > 0
if (weightFlag && ageFlag) {
value = true
}
} }
addSource(weight) { x -> x?.let {
weightFlag = x > 0
if (weightFlag && ageFlag) {
value = true
}
} }
}
我的 ViewModel 中有两个变量,它们由用户使用按钮控制。他可以通过单击适当的按钮来减少或增加值。
val age = MutableLiveData<Int>().apply { value = 0 }
val weight = MutableLiveData<Double>().apply { value = 0.0 }
现在我只想在两个变量的值都大于 0 时才启用保存按钮。该怎么做?我考虑过在 ViewModel correctData
中创建另一个 LiveData 变量或以某种方式在 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
由于您要合并两种不同的类型,我建议创建一个新的 class 来保存这些值:
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
}
})
}
使用另外 2 个布尔变量来跟踪 LiveData
是否都返回 true。
private val _correctData = MediatorLiveData<Boolean>().apply {
var weightFlag = false
var ageFlag = false
value = false
addSource(age) { x -> x?.let {
ageFlag = x > 0
if (weightFlag && ageFlag) {
value = true
}
} }
addSource(weight) { x -> x?.let {
weightFlag = x > 0
if (weightFlag && ageFlag) {
value = true
}
} }
}