简体   繁体   English

使用ObservableField <>,set()的双向数据绑定不起作用?

[英]2-way databinding with ObservableField<>, set() doesn't work?

I have a parent class, lets call it BaseViewModel , this class can be typed and have an ObservableField of the same type. 我有一个父类,我们称之为BaseViewModel ,这个类可以输入并且具有相同类型的ObservableField Like this : 像这样 :

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

}

I got many child for this class. 这节课让我有很多孩子。 One of them is StringViewModel that, like its name says, gives a String value. 其中一个是StringViewModel ,就像它的名字所示,它给出一个String值。 This child class overrides the setValue() method : 这个子类重写了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 ...

}

And I got a layout that use a StringViewModel : 我得到了一个使用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 ... -->

But when I call the setValue() method of my StringViewModel , the value is set to the ViewModel but not on the EditText . 但是当我调用StringViewModelsetValue()方法时,该值设置为ViewModel而不是EditText

Edit : I should also say that I've add my StringViewModel to my DataBinding correctly (using DataBindingUtil to inflate my DataBinding). 编辑:我还应该说我已正确地将我的StringViewModel添加到我的DataBinding中 (使用DataBindingUtil来扩展我的DataBinding)。

myDataBinding.setViewModel(new StringViewModel());

Does someone got an explanation to this behavior? 有人得到这种行为的解释吗?


EDIT 编辑

As @iMDroid said, I should have call notifyChange() in my method setValue() . 正如@iMDroid所说,我应该在我的方法setValue()调用notifyChange() setValue() I tought ObservableFields was doing it for me, my bad. 我认为ObservableFields是为我做的,我的坏。

I am not expert in two-way data binding.. but I have been reading articles about it so here is one solution which might help you. 我不是双向数据绑定的专家..但我一直在阅读有关它的文章,所以这里有一个可能对你有帮助的解决方案。

Suppose your model class is this: 假设你的模型类是这样的:

public class Echo {
  public String text;
}

And your layout file is R.layout.echo 你的布局文件是R.layout.echo

They say you are supposed to set the layout using the DataBindingUtil class and then the object on which you make the binding that is EchoBinding (automatically generated according to the layout) like this: 他们说你应该使用DataBindingUtil类设置布局,然后使用EchoBinding(根据布局自动生成)进行绑定的对象,如下所示:

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

Also, you can bind the value to your EditText using app:binding="@{echo.text}" attribute. 此外,您可以使用app:binding="@{echo.text}"属性将值绑定到EditText。

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

And lastly add notifyChange() to your setValue() method. 最后将notifyChange()添加到setValue()方法中。

Refer to this link for more information. 有关更多信息,请参阅此链接

You may give it a try.. Hope it helps. 你可以尝试一下..希望它有所帮助。

Adding the StringViewModel to the layout is not enough. 将StringViewModel添加到布局是不够的。 In the onCreate() or onCreateView() depending on which you are using(Activity or Fragment), you have to tell your dataBinding to use the defined StringViewModel class. 在onCreate()或onCreateView()中,根据您使用的(Activity或Fragment),您必须告诉dataBinding使用已定义的StringViewModel类。

in onCreate(), you want to do something like, 在onCreate()中,你想要做的事情,

dataBinding.viewModel = new StringViewModel(); dataBinding.viewModel = new StringViewModel();

now, the dataBinding knows what you mean and they are now connected. 现在,dataBinding知道你的意思,现在他们已经连接了。

I believe you have setup the dataBinding. 我相信你已经设置了dataBinding。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 MutableLiveData不起作用,ObservableField起作用-为什么? - MutableLiveData doesn't work, ObservableField does - why? 如何处理警告:未经检查调用 &#39;ObservableField(T)&#39; 作为原始类型 &#39;android.databinding.ObservableField&#39; 的成员 - How to handle warning:Unchecked call to 'ObservableField(T)' as a member of raw type 'android.databinding.ObservableField' BindingAdapter 不适用于 DataBinding - BindingAdapter doesn't work with DataBinding 双向数据绑定(在xml中),ObservableField,BaseObservable,我应该用哪个双向数据绑定? - Two-way databinding(in xml), ObservableField, BaseObservable , which one I should use for the two-way databinding? 数据绑定 - ObservableField<String> 不更新视图 - Databinding - ObservableField<String> not updating view onClick 与 dataBinding ViewModel 不起作用 - onClick with dataBinding an ViewModel doesn't work 如何格式化ObservableField(double)DataBinding? - How to format an ObservableField (double) DataBinding? setTextColor 不适用于 LiveData 和 DataBinding - setTextColor doesn't work with LiveData and DataBinding Anroid RecyclerView 中的数据绑定不起作用(Kotlin) - DataBinding in Anroid RecyclerView doesn't work (Kotlin) Android数据绑定开关侦听器不起作用 - android databinding switch listener doesn't work
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM