如何解决在 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 中。
感谢您的耐心和帮助!
最好的问候,马克。
解决方法
那可能不是您的文字代码,因为它不可编译。您不能传递相同的函数以用作任一来源的观察者,因为来源类型不同。
您的 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
}
,
请尝试类似的方法,但要注意可空性。接收到的值之一可以为空
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()
}
}
)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。