Как привязать объект livedata к данным (Android)

Сегодня у меня есть вопрос о mvvm и привязке данных на Android,

Я пытаюсь связать свойства объекта при просмотре.

У меня есть объект (модель) с некоторыми свойствами, например:

public String name;
public String title;
public int value;

У меня есть ViewModel с livedata, как это:

MutableLiveData<Object> _obj = new MutableLiveData<>();
public LiveData<Object> obj = _obj;

И, наконец, у меня есть такое представление:

<layout>
    <data>
        <variable
            name="viewModel">
            type="com.sample.app.viewmodels.MainViewModel" />
    </data>
    <LinearLayout
        ... >
        <TextView
            android:text:="@{viewModel.obj.name}"
            .../>
    </LinearLayout>
</layout>

Я видел, что мы можем сделать это в видео от «Android Developers» о «LiveData»: https://youtu.be/OMcDk2_4LSk?t=102

Она говорит, что это возможно в студии Android на версиях 3.1+. Но это не работает для меня.


person C. MARTIN    schedule 05.07.2019    source источник
comment
Вы установили ViewModel в своей привязке Activity/Fragment? Проверьте эту ссылку.   -  person Sanlok Lee    schedule 05.07.2019
comment
Привет, да, я использую это: binding.setLifecycleOwner(this)   -  person C. MARTIN    schedule 05.07.2019
comment
вы также установили binding.viewModel = viewModel? Можете ли вы показать часть, где вы устанавливаете эти параметры привязки   -  person Sanlok Lee    schedule 05.07.2019
comment
Да, я делаю так: public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { MainViewModel viewModel = ViewModelProviders.of(this).get(MainViewModel.class); MainFragmentBinding binding = MainFragmentBinding.inflate(getLayoutInflater()); binding.setViewModel(viewModel); binding.setLifecycleOwner(this); return binding.getRoot(); }   -  person C. MARTIN    schedule 06.07.2019
comment
почему вы создаете livedata из своего MuteableLiveData? почему бы не использовать MuteableLiveData для привязки?   -  person mahdi shahbazi    schedule 06.07.2019
comment
Да, это тоже возможно, и в первый раз это было так, но результат тот же.   -  person C. MARTIN    schedule 06.07.2019
comment
Наконец-то он работает! но поля объекта не предоставляются Android Studio. Я делаю это вручную. Еще одна вещь не работает, обновление пользовательского интерфейса, когда я меняю значение в поле, я делаю расчет, и я хотел бы обновить свое текстовое представление при изменении значений.   -  person C. MARTIN    schedule 06.07.2019
comment
Кто-нибудь может мне помочь?   -  person C. MARTIN    schedule 08.07.2019


Ответы (1)


Чтобы это работало, класс вашей модели должен расширять класс BaseObservable из библиотеки привязки данных. И вы должны вызывать notifyChange() для каждого метода установки следующим образом:

public class Object extends BaseObservable {
    public String name;
    public String title;
    public int value;

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

    public void setTitle(String title) {
        this.title = title;
        notifyChange();
    }

    public void setValue(int value) {
        this.value = value;
        notifyChange();
    }
}
person Birju Vachhani    schedule 21.07.2019
comment
Добро пожаловать ... пожалуйста, проголосуйте за мой ответ, если он вам помог. :) - person Birju Vachhani; 22.07.2019