通过Android数据绑定框架,我了解到您可以传递将baseObservable扩展到布局xml的对象,在getter上使用@Bindable并执行notifyPropertyChanged(BR.xxx)来重新评估相关部分。

我不明白的是:如果您不使用上面的大部分内容,而只是直接在xml中调用getter,那么何时对其进行评估?



这是代码:

my_widget.xml


<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools">

    <data>
        <variable
            name="someViewModel"
            type="com.example.SomeViewModel" />
    </data>

    <androidx.cardview.widget.CardView>
        <View
            android:id="@+id/testView"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:visibility="@{someViewModel.getName() ? View.VISIBLE : View.GONE}" />
    </androidx.cardview.widget.CardView>
</layout>


MyView.java

MyWidgetBinding binding = MyWidgetBinding.inflate(LayoutInflater.from(mContext), parent, false);
binding.setSomeViewModel(someViewModel);




问题:


如果someViewModel.name曾经更改过,testView的可见性是否会刷新?
someViewModel.getName()什么时候得到评估或多久评估一次?
如果表达式更复杂,则类似于:
android:visibility="@{func(otherVariable, someViewModel.getName()) ? View.VISIBLE : View.GONE}",例如otherVariable是上面数据部分中定义的另一个变量,如果以某种方式重新设置otherVariable,则someViewModel.getName()将得到求值,而testView将反映最新的可见性值,对吗?
跟进问题3,如果otherVariable更改为otherVariable.a,其中a是“可绑定”字段,并且在notifyPropertyChanged(BR.a)中调用otherVariable,则someViewModel.getName()也将得到重新评估,而testView会反映出最新的可见度值,对吗?
另外,如果我通过调用someViewModel来重新设置binding.setSomeViewModel(),但传入了SAME someViewModel实例,它会执行任何操作吗?表达式会重新评估吗?

最佳答案

如果someViewModel.name曾经更改过,testView的可见性是否会改变
刷新?


这取决于您使用的基础技术。 LiveData?是BaseObservable,您必须手动通知观察到的属性已更改。


何时对someViewModel.getName()进行评估,或多久评估一次?


LiveData?设置/发布值时。通知时为BaseObservable


与第2点相同
如果您更改基础值并正确通知此更改,它将进行相应的传播。如果更改观察对象的实例,则不会。

09-26 06:07