2016-09-21 1438 views
2

我有一个父类,我们可以称它为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是为我做的,我的坏。

回答

2

我不是双向数据绑定的专家..但我一直在阅读关于它的文章,所以这里有一个解决方案可以帮助你。

假设你的模型类是这样的:

public class Echo { 
    public String text; 
} 

而且你的布局文件是R.layout.echo

他们说,你应该使用 DataBindingUtil类设置布局,然后对象在其上进行EchoBinding绑定(根据布局自动生成 ),如下所示:

EchoBinding binding = DataBindingUtil.setContentView(
     this, R.layout.echo); 
    binding.setEcho(new Echo()); 

另外,您可以使用app:binding="@{echo.text}"属性将值绑定到EditText。

<EditText 
    android:layout_width=”match_parent” 
    android:layout_height=”wrap_content” 
    android:hint="Text 1" 
    app:binding="@{echo.text}"/> 

而且最后加入notifyChange()setValue()方法。

有关更多信息,请参阅此link

你可以试一试..希望它有帮助。

+0

感谢您的帮助,但是当我编辑我的问题时,我忘了提及这一点。我实际上已经正确使用DataBindingUtil将我的变量添加到DataBinding中。 – MHogge

+0

即使我编辑了我的答案..你尝试添加notifyChange()吗? – iMDroid

+1

不错,它的工作!我以为是因为它是ObservableField,我不需要通知任何东西,我的坏。感谢您的帮助,我会接受这个答案。 – MHogge

0

将StringViewModel添加到布局是不够的。在onCreate()或onCreateView()中,取决于您使用的是哪个(Activity或Fragment),您必须告诉dataBinding使用已定义的StringViewModel类。

中的onCreate(),你想要做的事就像

dataBinding.viewModel =新StringViewModel();

现在,dataBinding知道你的意思,他们现在连接。

我相信你已经设置了dataBinding。

+0

是的我将StringViewModel设置为我的DataBinding。对不起,我会更新我的问题以添加此信息。 – MHogge