Bindable не получать уведомления - PullRequest
0 голосов
/ 03 июля 2018
@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");, он обновляет имя в поле зрения, но не полное имя. Даже документация содержит ошибки и не надежна.

Другие посты, связанные с этой проблемой, не могли помочь, так как большинство из них имеют дело с непараметризуемыми Bindables.

Согласно этой строке в документе

Если у firstName или lastName есть уведомление об изменении, имя также будет считаться грязным. Это не означает, что onPropertyChanged (Observable, int) будет уведомлено для BR.name, только то, что выражения привязки, содержащие имя, будут загрязнены и обновлены.

Я также пытался позвонить notifyPropertyChanged(BR.name);, но это также не влияет на результат.

Ответы [ 2 ]

0 голосов
/ 03 июля 2018

Итак, после тщательного анализа концепций привязки данных, я обнаружил, что когда мы вызываем notifyPropertyChanged в классе BaseObservable, он на самом деле уведомляет свойство, но не методы получения и установки.

Так что в моем вопросе выше, в части 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, поэтому мне приходится слушать myViewModel.name вместо myViewModel.getName() в моем XML. И нам даже не нужно уведомлять name об изменениях, уведомляя только о том, что firstName или lastName уведомит свойство name из-за параметризованного Bindable.

Но убедитесь, что

0 голосов
/ 03 июля 2018

Просто взломать

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;
    }
}
...