如何改变 observableField 中的传入字符串

How to mutate an incoming string in an observableField

我将以下字段绑定到 editText。

val lastName = ObservableField(MutableLiveData<String>())

我想改变输入的字符串,以便第一个字母自动设置为大写。

所以如果你输入

williams -> Williams

我想我可以通过如下方式解决这个问题

    lastName.getObservable()
        .subscribe { input ->
            val lastname = input.decapitalize()
            lastName.getField().postValue(lastname.capitalize())
        }

我注意到这样做会使我陷入一个永恒的循环,因为后值每次都会触发订阅。我怎样才能通过 RxJava 改变传入的字符串,而不必像我现在那样做?

您可以通过覆盖 set 在源代码中执行此操作。看不出多层可观察性的原因,所以我在这里扁平化了。

val lastName = object: ObservableField<String>() {
        override fun set(value: String) {
            super.set(value.capitalize())
        }
    }

如果出于某种原因需要分层,您可以改写 MutableLiveData 的 setValue 方法。

val lastName = ObservableField(object: MutableLiveData<String>() {
        override fun setValue(value: String) {
            super.setValue(value.capitalize())
        }
    })

但是我觉得这种多层结构很复杂。如果可以覆盖 LiveData 实例,我看不出如何可靠地订阅基础数据。