1
@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; 
}

以上代码我从谷歌的示例代码中获取 - 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");,它都会更新视图中的名字,而不是全名。甚至文档都是错误的并且不可靠。

与此问题相关的其他帖子无济于事,因为它们中的大多数都处理非参数化的 Bindables。

根据文档中的这一行

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

我也试过打电话notifyPropertyChanged(BR.name);,但它也对结果没有影响。

4

2 回答 2

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;
    }
}
于 2018-07-03T11:00:24.810 回答
0

因此,在对数据绑定概念进行彻底分析后,我发现当我们调用类时notifyPropertyChangedBaseObservable它实际上通知了属性,而不是 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"}),因此数据绑定会生成该属性,因此我必须在我的 XML 中name进行监听myViewModel.name而不是监听。myViewModel.getName()而且我们甚至不必通知name更改,只通知firstNamelastName将通知属性name,因为参数化可绑定。

但请确保

于 2018-07-03T11:10:21.450 回答