Использование Databinding LiveData в макетах без observe

Рейтинг: 2Ответов: 1Опубликовано: 12.05.2023

Никак не получается заставить работать есть Activity на нём Fragment, во фрагменте есть SwipeRefreshLayout

<androidx.swiperefreshlayout.widget.SwipeRefreshLayout
    android:id="@+id/swipeRefresh"
    app:refreshing="@{vievModelList.flUpdate}">

ViewModel создается на Activity и в нём есть

public class ViewModelList extends AndroidViewModel

public MutableLiveData<Boolean> flUpdate = new MutableLiveData<>(false);

во фрагменте подключаю databinding

@Override
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    binding = FragmentListBinding.inflate(getLayoutInflater());
    binding.setLifecycleOwner(getActivity());
    modelList = new ViewModelProvider(requireActivity()).get(typeList, ViewModelList.class);
    binding.setVievModelList(modelList);

Но при изменении flUpdate ничего не происходит. Вот если добавить observe

LiveData<Boolean> statusDoc = modelList.getFlUpdate();
statusDoc.observe(this, status -> {
    binding.setVievModelList(modelList);
});

то всё начинает правильно работать. Подскажите, возможно заставить databinding работать без observe? Если я правильно понимаю то макет должен сам создавать у себя подписку на изменения. Возможно дело в

binding.setLifecycleOwner(getActivity());

Но я пробовал менять getActivity() на this и на requireActivity(), результат нулевой.


Добавлено:

Нашел вот такой способ добиться желаемого, поменял тип поля на ObservableField

public ObservableField<Boolean> flUpdate = new ObservableField<>(false);

Но пока не совсем понятно чем отличается ObservableField от MutableLiveData. Для этой переменной проблем нет, а вот что будет если и другие переделать не придётся ли переделывать всю логику?


Добавлено:

Согласно вот этой ссылке ничего особого делать не нужно,

https://medium.com/androiddevelopers/android-data-binding-library-from-observable-fields-to-livedata-in-two-steps-690a384218f2

нужно только правильно указать владельца жизненного цикла. Но что бы я не указывал (this, this.getViewLifecycleOwner(), getActivity()) (Делаю я это во фрагменте), ничего не срабатывает.

Вот если повернуть экран, например, то переменная перечитывается.

Ответы

▲ 0

судя по симптомам (работает если добавить обзервер), Вам нужна двухсторонняя связь. попробуйте так с MutableLiveData:

<androidx.swiperefreshlayout.widget.SwipeRefreshLayout
    android:id="@+id/swipeRefresh"
    app:refreshing="@={vievModelList.flUpdate}"> 

обратите внимание на изменение в нотации: была односторонняя @{} , а стала двухсторонняя @={}