Привязка данных с 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;
    }
}

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

public class User
{
    public MutableLiveData<String> name;

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

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

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

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


person Charly Lafon    schedule 06.01.2019    source источник


Ответы (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)

person John O'Reilly    schedule 06.01.2019
comment
Так что мне не придется использовать какие-либо LiveData или ObservableFields в ViewModel? Я сейчас обновляю Android Studio, посмотрю, работает ли это, но это меня удивляет, ха-ха - person Charly Lafon; 06.01.2019
comment
ах, я пропустил, что вы не использовали LiveData в своем ViewModel... да, вышеизложенное будет основано на использовании этого - person John O'Reilly; 06.01.2019
comment
@CharlyLafon, есть ли причина, по которой у тебя не может быть что-то вроде MutableLiveData<User> в ViewModel? - person John O'Reilly; 06.01.2019
comment
Не заполнять ViewModel привязкой к Android — это круто. Я не хочу трогать класс User, вот и все. Итак, вы думаете, что создание пользовательского поля MutableLiveData‹User› является решением (извините, я до сих пор не могу попробовать ваши ответы, моя студия Android изо всех сил пытается обновить)? Я думал, что это не сработает, потому что я хочу слушать изменения поля имени пользователя, а не изменения самого пользователя. - person Charly Lafon; 06.01.2019
comment
Вы также можете иметь MutableLiveData<String> в своем ViewModel, если просто хотите управлять только строкой имени, но я думаю, что наличие его для User может быть более гибким. В вашем макете вы должны иметь возможность привязываться к чему-то вроде vm.user.name - person John O'Reilly; 06.01.2019

person    schedule
comment
Могу ли я сделать что-то подобное, но не касаясь класса POJO? Только ViewModel. - person Charly Lafon; 06.01.2019