2015-12-15 20 views
9

Sto utilizzando la libreria di associazione dati di Android. Ho il mio oggetto dati che si estende BaseObservable.Android: Databinding, notifyPropertyChanged() non funziona?

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

E il mio xml è rilegato così

<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()}" 
       /> 

Il legame avviene per i valori iniziali. Ma quando cambio il valore usando

object.setTotalText(someSpannableString); 

le modifiche non si riflettono nella visualizzazione del testo. Quale potrebbe essere il problema?

+0

potresti risolvere il tuo problema, signore? –

+0

@mahdipishguy: No signore. Il problema non è stato risolto, ma – Ashwin

risposta

6

Utilizzo del nome del campo intestazione di 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

sembra errato, dovresti usare la classe 'BR' per identificare il campo _AND_ avere sia il setter che il getter annotati con' @ Bindable' – LambergaR

1

Ho appena avuto lo stesso problema. La mia rilegatura funzionerebbe per la prima volta e quindi non funzionerebbe la seconda volta.

Ho avuto una configurazione identica alla tua, tranne che avevo messo @Bindable sul mio setter e non il mio metodo getter.

L'aggiunta di @Bindable a mio setter e getter ha risolto il problema per me.

Quando il debug dei lavoratori interni di rilegatura dei dati della libreria ho notato che un metodo chiamato richiesta di re-bind non veniva chiamato perché ha fatto un intervento per verificare se il campo è stato aggiornato o non dal ultimo valore. La mia ipotesi è che hai bisogno dell'annotazione su entrambi i metodi in modo che possa fare questa conferma interna per verificare se è necessario re-associare o meno .

Non sono 100% se questo è vero oppure no, ma avendo l'annotazione su entrambi i metodi risolto il problema. Osservando la documentazione della libreria Data Binding, noto che mostrano semplicemente l'annotazione sul getter.

Si può provare:

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

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

vedere se risolve.