Android与房间表模型的双向数据绑定

时间:2018-10-31 07:15:31

标签: android android-room android-databinding android-architecture-components

所以我有用@Entity注释注释的房间模型类,其中包含用@ColumnInfo注释的字段。

我还有一个绑定到该模型对象的视图:

   <EditText
        android:id="@+id/sadfadsdfasd"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:gravity="center"
        android:hint="@string/assdsa"
        android:inputType="text"
        android:text="@={fuelPrice.modification}" />

就像这样,它在显示EditText时起作用。它显示了我的模型的价值,但是当我修改EditText时,即使我使用@ =符号表示双向绑定,该修改也不会存储在对象中。

所以,如果我理解正确,我真的不能将POJO与简单的原始字段用于双向数据绑定,而是应该将所有字段作为可观察类型的必需类型或包含在LiveData中的字段?

如果上述情况成立,是否意味着要对房间实体进行双向绑定,我必须为每个实体创建单独的类,以实现所有可观察字段并相应地更新我的实体对象?还是有一个更简单的解决方案?

编辑 以上案例均为假。似乎两种方式的绑定确实适用于具有适当的getter和setter的简单POJO类。

2 个答案:

答案 0 :(得分:2)

我刚刚测试了

AFAIK ,它应该在没有ObservableField的情况下也可以工作,因为modification是带有标准getter和setter的私有字段。使用

android:text="@={fueldPrice.modification}"

class FuelPrice {
    private String modification;

    public String getModification() {
        return modification;
    }

    public String setModification(String modification) {
        this.modification = modification;
    }
}

如果您仅使用公共字段,它也可以工作

class FuelPrice {
    public String modification;
}

答案 1 :(得分:1)

您可以按以下方式使用observableField:

public class FuelPrice {
  public ObservableField<String> modification = new ObservableField<>();
  public TextWatcher watcher = new TextWatcherAdapter() {
    @Override public void afterTextChanged(Editable s) {
      if (!Objects.equals(modification.get(), s.toString())) {
        modification.set(s.toString());
      }
    }
  };
}

并如下更新您的XML:

 <EditText
    android:id="@+id/sadfadsdfasd"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_weight="1"
    android:gravity="center"
    android:hint="@string/assdsa"
    android:inputType="text"
    android:addTextChangedListener=”@{fuelPrice.watcher}” />

参考:

  

Two-way Android Data Binding