2016-07-31 10 views
0

Ich habe mit der Android-Datenbindungsbibliothek experimentiert, die dem Google-Entwicklerhandbuch folgt. Aber auch mit dem Folgen ihres Codes funktioniert notifyPropertyChanged() nie.Android-Datenbindung mCallback ist immer null

mCallbacks in der BaseObservable ist immer null. Ich habe den Code debugged als die Bindung eingerichtet ist und addOnPropertyChangedCallback aufgerufen wird und mCallbacks festgelegt ist, aber aus irgendeinem Grund wurde diese Referenz verloren, wenn Sie um notifyPropertyChanged() aufrufen.

Es gibt wahrscheinlich etwas, das ich vermisse, so würde jede Hilfe sehr geschätzt werden!

Code:

public class TestActivity extends AppCompatActivity { 

TestModel mTestModel; 
ActivityTestBinding mBinding; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    mBinding = DataBindingUtil.setContentView(this, R.layout.activity_test); 
    mTestModel = new TestModel("Test", "User"); 
    mBinding.setTestModel(mTestModel); 

    mBinding.ratingBtnUpdate.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      mTestModel.setFirstName("New"); 
      mTestModel.setLastName("WOOOOORKS"); 
      mBinding.notifyPropertyChanged(BR.firstName); 
     } 
    }); 
}} 


public class TestModel extends BaseObservable { 

private String firstName; 
private String lastName; 

public TestModel(String firstName, String lastName) { 
    this.firstName = firstName; 
    this.lastName = lastName; 
} 

@Bindable 
public String getFirstName() { 
    return this.firstName; 
} 

@Bindable 
public String getLastName() { 
    return this.lastName; 
} 

public void setFirstName(String firstName) { 
    this.firstName = firstName; 
} 

public void setLastName(String lastName) { 
    this.lastName = lastName; 
}} 

Layout:

<layout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    > 


    <data> 
     <variable 
      name="testModel" 
      type="com.boundless.happymeter.model.TestModel" 
      /> 
    </data> 


    <LinearLayout 
     android:orientation="vertical" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     > 

     <TextView 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:text="@{testModel.firstName}" 
      /> 

     <TextView 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:text="@{testModel.lastName}" 
      /> 

     <Button 
      android:id="@+id/rating_btn_update" 
      android:layout_width="match_parent" 
      android:layout_height="48dp" 
      android:text="Update" 
      /> 

    </LinearLayout> 


</layout> 

Hinweis: Es ist möglich, die Bindung durch die Verwendung mBinding.invalidateAll() zu zwingen - aber das ist ein ziemlich hässlich soloution

Antwort

0

können Sie executePendingBindings() verwenden, es werden alle Bindungen ausgeführt, die geändert wurden und aktualisiert werden müssen.

binding.executePendingBindings(); 

Andere Lösung ist, dass Sie notifyPropertyChanged(); in allen Setter-Methoden

public void setFirstName(String firstName) { 
    this.firstName = firstName; 
    notifyPropertyChanged(BR.firstName); 
} 
+0

, dass ein Reiz gearbeitet verwenden können! Ich benutzte mBinding.notifyPropertyChanged (anstelle der Super-Methode in BaseObservable), so dass der Rückruf natürlich null war, Danke! – enyciaa