Привязка данных с помощью ViewModel и Model
(Французский здесь, извините за возможные недоразумения)
Я новичок в привязке данных на 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 ответа
В вашем файле макета у вас будет что-то вроде:
<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
)
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);
}
}