使用Room表模型实现Android双向数据绑定

4

我有一些用@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进行双向数据绑定,而应该将所有字段作为所需类型的observable或包装在LiveData中的字段?

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

编辑 上述情况是错误的。看起来对于具有适当getter和setter的简单POJO类,双向绑定确实有效。


修改没有被存储在我的对象中,你是真的指的对象还是期望修改被保存到数据库中? - lelloman
1
@Lelloman,我的意思是我的对象,而不是数据库。我不打算使用LiveData,其中所有更改都直接存储在数据库中,我只想能够通过绑定修改对象,并在需要时将其存储在数据库中。 - SMGhost
即使不使用ObservableField,我也期望能够实现这一点,那么“modification”是Kotlin的“var”吗? - lelloman
不是的,它是Java的字符串变量。它在EditText上显示,但是当手动更改它时,setModification()方法不会被调用。 - SMGhost
你能否请提供你的模型代码?我刚测试过,它按照我的回答正常工作。 - lelloman
2个回答

2

据我所知 我刚刚测试了一下,如果modification是一个私有字段并且有标准的getter和setter方法,那么它应该可以在没有ObservableField的情况下工作。使用

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

可能是我这边出了其他问题,因为现在当我尝试时,它可以工作。谢谢! - SMGhost

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}” />

参考资料:

Android双向数据绑定

.


因此,这种方法的问题在于我已经有了燃油价格类,其中包含字符串、整数和其他类型的字段。因此,为了将它们全部放入Observables中,我实际上需要创建一个单独的模型用于绑定,然后将其转换为Room的模型,以便将其保存到数据库中。如果没有其他解决办法,那么我想这样做也可以。 - SMGhost

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接