使用DataBinding时MediatorLiveData永远不会变为活动状态

时间:2018-08-06 17:21:04

标签: android android-databinding android-livedata

问题

使用DataBinding绑定到布局的MediatorLiveData永远不会处于活动状态,因此不会考虑其源更改

我要做什么

我正在使用DataBinding将ViewModel的MediatorLiveData的值双向绑定到SeekBars进度,如下所示:

<SeekBar
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:max="@{ShaderParameterValue.SEEKBAR_MAX}"
        android:progress="@={parameter.value.basisPoint}"/>

basepointPoint字段定义如下

val basisPoint: MediatorLiveData<Int> = object: MediatorLiveData<Int>(){

    override fun setValue(value: Int?) {
        super.setValue(value)
        value?.let { updateCurrentValue(it) }
    }

}.also {
    it.addSource(startValue) { value ->
        calculateBasisPoint(it)
    }
    it.addSource(currentValue) { value ->
        calculateBasisPoint(it)
    }
    calculateBasisPoint(it)
}

我发现的东西

我要添加两个源,但是由于LiveData从未像调试器所验证的那样处于活动状态,因此从未调用calculateBasisPoint

当我将自己的观察者(下面)添加到basePoint字段中时,代码将按预期工作。

 it.value.basisPoint.observe(this@GLActivity, Observer {
      Log.d(TAG, "basisPoint " + it)
 });

当SeekBar值更改时,DataBinding还可以正确更新basePoint。

DataBinding是否将MediatorLiveData标记为活动状态?这是一个错误,还是我在这里误会了什么?

我不确定在哪里可以找到用于SeekBar绑定的DataBinding源以验证逻辑,但是我认为它应该像往常一样使用LiveData的观察,所以我看不出这里可能出什么问题。

0 个答案:

没有答案