可绑定未通知

时间:2018-07-03 10:49:16

标签: android android-databinding bindable

@Bindable
public String getFirstName() { 
    return this.firstName;
}

public void setFirstName(String firstName) {
    this.firstName = firstName;
    notifyPropertyChanged(BR.firstName);
}

@Bindable
public String getLastName() { 
    return this.lastName;
}

public void setLastName(String lastName) {
    this.lastName = lastName;
    notifyPropertyChanged(BR.lastName);
}


@Bindable({"firstName", "lastName"})
public void getName() { 
    return this.firstName + ' ' + this.lastName; 
}

以上是我从Google的示例代码中提取的代码-https://developer.android.com/reference/android/databinding/Bindable

并以类似XML的格式使用

<TextView
    android:id="@+id/first_name"
    .....
    android:text="@{myViewModel.firstName}" />
<TextView
    android:id="@+id/last_name"
    .....
    android:text="@{myViewModel.lastName}" />
<TextView
    android:id="@+id/full_name"
    .....
    android:text="@{myViewModel.getName()}" />

每当我打电话给myViewModel.setFirstName("Mohammed");时,它都会更新视图中的名字,而不是全名。甚至文档都是错误的,也不可靠。

与此问题相关的其他帖子没有太大帮助,因为它们中的大多数都处理非参数化的Bindable。

按照文档中的这一行

  

每当firstName或lastName发出更改通知时,名称也将被视为不合法。这并不意味着将为BR.name通知onPropertyChanged(Observable,int),只有包含name的绑定表达式才会被弄脏和刷新。

我也尝试调用notifyPropertyChanged(BR.name);,但这对结果没有任何影响。

2 个答案:

答案 0 :(得分:2)

只是个黑客

public class Modal {
    private String firstName;
    private String lastName;
    private String name;

    @Bindable
    public String getFirstName() {
        return this.firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
        notifyPropertyChanged(BR.firstName);
        notifyPropertyChanged(BR.name);
    }

    @Bindable
    public String getLastName() {
        return this.lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
        notifyPropertyChanged(BR.lastName);
        notifyPropertyChanged(BR.name);
    }


    @Bindable
    public void getName() {
        return this.firstName + ' ' + this.lastName;
    }
}

答案 1 :(得分:1)

因此,在对数据绑定概念进行了彻底分析之后,我发现,当我们在notifyPropertyChanged类上调用BaseObservable时,它实际上是通知属性,而不是通知getter和setter。

因此,在我上面的问题中,JAVA部分没有任何更改,但是XML部分中需要进行更改。

<TextView
    android:id="@+id/first_name"
    .....
    android:text="@{myViewModel.firstName}" />
<TextView
    android:id="@+id/last_name"
    .....
    android:text="@{myViewModel.lastName}" />
<TextView
    android:id="@+id/full_name"
    .....
    android:text="@{myViewModel.name}" />

由于我将getName()声明为Bindable({"firstName", "lastName"}),因此数据绑定将生成属性name,因此我必须在XML中侦听myViewModel.name而不是myViewModel.getName()。而且我们甚至不必通知name进行更改,由于参数化的Bindable,仅通知firstNamelastName会通知属性name

但是请确保