Привязка данных с помощью ViewModel и Model - PullRequest
0 голосов
/ 06 января 2019

(французский здесь, извините за возможные недоразумения)

Я новичок в привязке данных на Android и борюсь с довольно простой проблемой.

Допустим, у меня есть этот POJO, который мы рассмотрим как часть моей модели

public class User
{
    public String name;

    public User(String name)
    {
        this.name = name;
    }
}

Теперь у меня есть ViewModel, которая содержит пользователя

public class MyViewModel extends ViewModel
{
    private User user = new User("blue");

    public String getName()
    {
        return user.name;
    }

    public void setName(String name)
    {
        user.name = name;
    }
}

Я хочу, чтобы View (Activity) мог выполнять двустороннюю привязку данных в этом поле "name". Я знаю, как делать Activity и XML, такие как настройка класса Binding и т. Д. Что я не знаю, так это сделать ViewModel наблюдаемым для любых изменений в поле «name» класса User. Обратите внимание, что я не хочу, чтобы сделал мой класс User видимым, выполнив:

public class User
{
    public MutableLiveData<String> name;

    public User(String name)
    {
        this.name.setValue(name);
    }
}

потому что я лично предпочитаю хранить эту Android-штуку подальше от моей модели.

Как я могу изменить свою ViewModel, чтобы View мог прослушивать изменения «name»? Я видел кое-что с аннотацией @Bindable, но не совсем уверен, как ее использовать.

Спасибо за вашу помощь

Ответы [ 2 ]

0 голосов
/ 06 января 2019

В вашем файле макета у вас будет что-то вроде:

<data>
    <variable name="vm" type="<your_package>.MyViewModel" />
</data>

Тогда у вас может быть что-то вроде TextView, которое связывается с именем, используя:

        <TextView
            android:id="@+id/name"
            android:text="@{vm.name}"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"/>

Еще одна важная вещь, которую вам нужно сделать, это вызвать следующее в вашей деятельности / фрагменте:

binding.setLifecycleOwner(this)

(вместе с binding.vm = yourViewModelInstance)

0 голосов
/ 06 января 2019
You can add Bindable like this in your POJO Class

public class User extends BaseObservable
{
  public String name;
  public User(String name)
  {
    this.name = name;
  }

 @Bindable
 public String getName() 
 {
    return name;
 }

 public void setName(String name)
 {
    this.name = name;
    notifyPropertyChanged(BR.name);
}
}
...