我有一个父类,我们可以称它为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,就像它的名字说的那样,它给出了一个字符串值。这个子类覆盖的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上。
编辑:我还要说,我已经加我StringViewModel我数据绑定正确(使用DataBindingUtil夸大我的数据绑定)。
myDataBinding.setViewModel(new StringViewModel());
是否有人得到了一个解释这种现象?
编辑
正如@iMDroid说,我应该有通话notifyChange()
在我的方法setValue()
。我买ObservableFields是为我做的,我的坏。
感谢您的帮助,但是当我编辑我的问题时,我忘了提及这一点。我实际上已经正确使用DataBindingUtil将我的变量添加到DataBinding中。 – MHogge
即使我编辑了我的答案..你尝试添加notifyChange()吗? – iMDroid
不错,它的工作!我以为是因为它是ObservableField,我不需要通知任何东西,我的坏。感谢您的帮助,我会接受这个答案。 – MHogge