Android двухстороннее связывание данных с моделями комнатных таблиц - PullRequest
0 голосов
/ 31 октября 2018

Итак, у меня есть классы моделей комнат с аннотацией @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?

Если приведенный выше случай истинен, означает ли это, что для двухстороннего связывания для сущностей комнаты я должен создать отдельный класс для каждой сущности, который бы реализовывал все наблюдаемые поля и соответственно обновлял мой объект сущности? Или есть более простое решение?

EDIT Выше дело было ложным. Похоже, двухстороннее связывание работает для простых классов POJO с соответствующими методами получения и установки.

Ответы [ 2 ]

0 голосов
/ 31 октября 2018

AFAIK Я только что протестировал его, он должен работать без ObservableField, учитывая, что modification - это закрытое поле со стандартными геттерами и сеттерами. Использование

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;
}
0 голосов
/ 31 октября 2018

Вы можете использовать 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

.

...