2015-12-15 7 views
9

Ich verwende die Datenbindungsbibliothek von Android. Ich habe mein Datenobjekt erweitert BaseObservable.Android: Datenbindung, notifyPropertyChanged() funktioniert nicht?

public static class SimpleData extends BaseObservable implements Serializable { 
    private String text, subText; 
    private SpannableString totalText; 
@Bindable 
    public SpannableString getTotalText() { 
     return totalText; 
    } 

    public void setTotalText(SpannableString totalText) { 
     this.totalText = totalText; 
     notifyPropertyChanged(BR.totalText); 
    } 
} 

Und mein xml ist auch binded

<TextView 
       android:id="@+id/patient_name" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:textAppearance="?android:attr/textAppearanceMedium" 
       android:layout_marginLeft="16dp" 
       android:layout_toRightOf="@+id/patient_image" 
       android:textColor="@color/primary_text" 
       android:text="@{object.getTotalText()}" 
       /> 

Die Bindung Ort für die Anfangswerte erfolgt. Aber wenn ich den Wert mit

ändern, werden die Änderungen nicht in der Textansicht wiedergegeben. Was könnte das Problem sein?

+0

könnten Sie Ihr Problem lösen, Sir? –

+0

@mahdipishguy: Nein, mein Herr. Das Problem ist noch nicht gelöst – Ashwin

Antwort

6

Verwendung des Feldnamens intad of getter.

<TextView 
       android:id="@+id/patient_name" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:textAppearance="?android:attr/textAppearanceMedium" 
       android:layout_marginLeft="16dp" 
       android:layout_toRightOf="@+id/patient_image" 
       android:textColor="@color/primary_text" 
       android:text="@{object.totalText}"/> 
+0

scheint falsch, sollten Sie die 'BR' Klasse verwenden, um das Feld zu identifizieren _AND_ haben sowohl der Setter und Getter mit '@ Bindable' annotiert – LambergaR

1

Ich hatte gerade das gleiche Problem. Meine Bindung würde beim ersten Mal funktionieren und würde dann beim zweiten Mal nicht funktionieren.

Ich hatte ein identisches Setup wie du, außer dass ich @Bindable auf meinen Setter gesetzt hatte und nicht meine Getter-Methode.

Hinzufügen von @Bindable zu meinem Setter und Getter behoben dieses Problem für mich.

Als ich gedebuggt die inneren Arbeiter der Datenbibliothek Bindung I bemerkt, dass ein Verfahren namens Anforderung re-bind nicht genannt wurde, weil es eine Operation haben zu prüfen, ob das Feld aktualisiert wurde oder nicht von der letzter Wert Meine Vermutung ist, dass Sie die Annotation auf beide Methoden benötigen, so dass es diese interne Bestätigung durchführen kann, um zu überprüfen, ob es erneut binden muss oder nicht.

Ich bin nicht 100%, wenn das stimmt oder nicht, aber die Annotation auf beiden Methoden behoben mein Problem. Wenn ich auf die Dokumentation der Data Binding-Bibliothek schaue, bemerke ich, dass sie nur die Annotation auf dem Getter anzeigt.

können Sie versuchen:

@Bindable 
public SpannableString getTotalText() { 
    return totalText; 
} 

@Bindable 
public void setTotalText(SpannableString totalText) { 
    this.totalText = totalText; 
    notifyPropertyChanged(BR.totalText); 
} 

Sehen Sie, wenn es sie verrechnet wird.

Verwandte Themen