EditText中的Android LiveData操作



我有3个editext,我必须将前两个中写入的数字相乘,并使用Android Livedata在第三个中实时显示结果。

viewModel.num1.observe(this,
Observer { newNum1-> binding.ediText1.text = newNum1.toString() }
viewModel.num2.observe(this,
Observer { newNum2-> binding.ediText2.text = newNum2.toString() }
viewModel.num3.observe(this,
Observer { newNum3-> binding.ediText3.text = newNum3.toString() }

我尝试过这样的方法,使用2个MutableLiveData和一个MediatorLivedata,但我做错了,因为它没有实时更新第三个EditText。有人能帮我吗?

class MyViewModel : ViewModel() {
private var num1 = MutableLiveData<Int>();
private var num2 = MutableLiveData<Double>();
private var mun3 = MediatorLiveData<Double>();
num3.addSource(num1, this::onChanged);
num3.addSource(num2, this::onChanged);


private fun onChanged(x : Double) {
var a = num1.value
var b = num2.value
if (a== null)
a= 0;
if (b== null)
b= 0.0;

num3.setValue(a * b);
}
}

我正在使用Kotlin,但我接受任何类型的代码,即使是java代码。

感谢您的耐心和帮助!

致以最良好的问候,马克。

请尝试类似的操作,但要注意可为空性。接收到的值之一可以是空

fun <A, B> LiveData<A>.combineWith(b: LiveData<B>): LiveData<Pair<A?, B?>> =
MediatorLiveData<Pair<A?, B?>>().apply {
var lastA: A? = this@combineWith.value
var lastB: B? = b.value
addSource(this@combineWith) {
lastA = it
value = Pair(lastA, lastB)
}
addSource(b) {
lastB = it
value = Pair(lastA, lastB)
}
}
viewModel.num1
.combineWith(viewModel.num2)
.observe(
this, 
Observer { (first, second) -> 
if (first != null && second != null) {
someEditText.text = (first * second).toString()
}
}
)

这可能不是您的文字代码,因为它不可编译。由于源类型不同,您不能传递相同的函数作为任一源的观测器。

onChanged()函数不使用输入参数,因此可以删除该参数,并从传递给每个addSource调用的lambda中调用它。

您还可以通过使用Elvis运算符来简化函数的内容。

private val num1 = MutableLiveData<Int>()
private val num2 = MutableLiveData<Double>()
private val num3 = MediatorLiveData<Double>().apply {
addSource(num1) { onChanged() }
addSource(num2) { onChanged() }
}
private fun onChanged() {
val a = num1.value ?: 0
val b = num2.value ?: 0.0
num3.value = a * b
}

最新更新