У меня есть родительский класс, назовем его BaseViewModel, этот класс можно напечатать и иметь ObservableField того же типа. Например:Двухсторонняя привязка данных с ObservableField <>, set() не работает?
public class BaseViewModel<T> extends BaseObservable {
ObservableField<T> value = new ObservableField<>();
public T getValue() {
return value.get();
}
public void setValue(T value) {
this.value.set(value);
setHasChanges(value != originalValue);
}
}
У меня много детей для этого класса. Один из них - StringViewModel, который, как и его имя, дает значение String. Этот дочерний класс переопределяет метод SetValue():
public class StringViewModel extends BaseViewModel<String> {
@Override
public void setValue(String value) {
this.value.set(value);
if(value != null && !value.isEmpty()){
setHasChanges(!value.equals(originalValue));
}
else if(originalValue == null)
setHasChanges(false);
else
setHasChanges(!originalValue.isEmpty());
}
//Other methods ...
}
И я получил раскладку, которая использует StringViewModel:
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools">
<data>
<variable
name="viewModel"
type="com.myproject.viewmodels.StringViewModel" />
</data>
<EditText
android:id="@+id/value"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:clickable="@{viewModel.editable}"
android:cursorVisible="@{viewModel.editable}"
android:ellipsize="end"
android:focusable="@{viewModel.editable}"
android:focusableInTouchMode="@{viewModel.editable}"
android:inputType="textMultiLine|textNoSuggestions"
android:text="@={viewModel.value}"
app:setError="@{viewModel.error}"
tools:text="Dupont" />
<!-- Other layouts ... -->
Но когда я называю SetValue() метод моего StringViewModel, значение устанавливается в ViewModel, но не на EditText.
Edit: Я должен также сказать, что я добавить свой StringViewModel к моему DataBinding правильно (с использованием DataBindingUtil раздувать мой DataBinding).
myDataBinding.setViewModel(new StringViewModel());
ли кто-то получил объяснение такого поведения?
EDIT
Как сказал @iMDroid, я должен позвонить notifyChange()
в моем методе setValue()
. I tought ObservableFields делал это для меня, мой плохой.
Спасибо за помощь, но поскольку я редактировал свой вопрос, я забыл упомянуть об этом. На самом деле я правильно добавил свою переменную в DataBinding, используя DataBindingUtil. – MHogge
Даже я отредактировал свой ответ .. Вы пытались добавить notifyChange()? – iMDroid
Хорошая работа! Я думал, потому что это ObservableField, я ничего не должен был уведомлять, я плохо. Спасибо за помощь, я приму это как ответ. – MHogge