2 votes

ObservableField ne propage pas les changements

J'essaie la fonction de liaison de données pour Android et il semble que les champs Observable ne propagent pas la modification à l'interface utilisateur.

Si je prolonge le BaseObservable tout fonctionne comme prévu, mais lorsque je passe à la classe ObservableBoolean o ObservableField les données changent mais elles ne sont pas propagées à l'interface utilisateur.

le modèle

public class User {
  public final ObservableBoolean tapped = new ObservableBoolean(false);

    public boolean isTapped() {
        return tapped.get();
    }

    public void setTapped(boolean tapped) {
        this.tapped.set(tapped);
    }
}

la mise en page

<layout 
    <data>
        <variable
            name="user"
            type="User"/>
          ....
    </data>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        android:background="@{user.tapped ? @color/colorAccent : @color/white}"
        android:onClick="@{() -> user_holder.onClickTest(user)}">

        ......
    </LinearLayout>
</layout>

Des idées ?

4voto

George Mount Points 12374

Il semble que vous ayez confondu le mauvais système de liaison des données. Non seulement vous avez un champ public, mais vous avez aussi des getters et setters pour ce champ. Android Data Binding tente d'abord de se lier au getter et si cela échoue, il se lie au champ.

Si vous modifiez le nom de l'appellation utilisée dans les méthodes (par ex. isPersonTapped() , setPersonTapped(...) ), vous n'aurez pas de problème. Puisque vous disposez des méthodes d'accès, vous pouvez également utiliser un champ privé et notifier vous-même la modification :

public class User extends BaseObservable {
    private boolean tapped = false;

    @Bindable
    public boolean isTapped() {
        return tapped;
    }

    public void setTapped(boolean tapped) {
        this.tapped = tapped;
        notifyPropertyChanged(BR.tapped);
    }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X