MVVM + привязка данных + модель представления не обновляет представление - PullRequest
0 голосов
/ 06 февраля 2019

У меня странная проблема.Я хочу установить обновление для swipeRefreshLayout в зависимости от загрузки данных.Так что у меня есть слушатель, который получает истину / ложь в зависимости от выборки данных.Затем он переходит к ViewModel, где установлен ObservableBoolean, и благодаря DataBinding он должен обновить refreshLayout.Это работает .. когда устройство подключено к Интернету.

Вот мой слушатель

        @Override
        public void isLoading(boolean loading) {
            Log.d(TAG, "isLoading: "+loading);
            //binding.slHomeSwipe.setRefreshing(loading); <- this one works
            viewModel.isLoading.set(loading); // I want to use this, but it's not working
        }

Вот мой ViewModel.onRefresh () работает каждый раз.В логе setLoading () всегда отображается правильное значение.Когда у меня нет подключения к интернету, в журнале отображается ложь, но круг обновления не скрывается.

public class MainFragmentViewModel extends ViewModel {

...
public ObservableBoolean isLoading;

..init - isLoading = new..

public void onRefresh() {
    Log.d(TAG, "onRefresh: ");
    MainLib.refreshForecast();
}

void setLoading(boolean loading) {
    Log.d(TAG, "setLoading: "+loading);
    this.isLoading.set(loading);
}

И есть мой макет.Я поставил TextView для проверки правильности логического значения, но это не так.Он работает только тогда, когда работает swipeRefreshLayout.

<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/cl_home_main"
...>

<TextView
    android:id="@+id/tv_home_test"
    android:text="@{String.valueOf(viewModel.isLoading)}"
    .../>

<androidx.swiperefreshlayout.widget.SwipeRefreshLayout
    android:id="@+id/sl_home_swipe"
    app:onRefreshListener="@{() -> viewModel.onRefresh()}"
    app:refreshing="@{viewModel.isLoading}"
.../>

    <androidx.recyclerview.widget.RecyclerView
.../>

Я не думаю, что причина, по которой он не работает, заключается в сетевом соединении.Но это тот случай, когда я заметил, что он не работает.Когда приложение запускается, слушатель отправляет значение true, а не false, и оно работает.Но когда обновление начинается при смахивании, оно не работает.Я подозреваю, что viewModel каким-то образом отключен от макета.

1 Ответ

0 голосов
/ 07 февраля 2019

У меня все работает!

Проблема заключалась в том, что, когда у меня не было подключения к Интернету, и я обновлялся, мой слушатель возвращал false.В этой части я не уверен, но я думаю, что, поскольку мой ObservableBoolean не изменил состояние (оставался ложным), он не оказал влияния на структуру смахивания, поэтому при смахивании макета внутренне устанавливают обновление на true, в то время как мой ObservableBoolean имеет значение false,Поэтому мне пришлось установить это значение в true сразу после начала обновления данных.

Это мой метод ViewModel

public void onRefresh() {
    Log.d(TAG, "onRefresh: ");
    MainLib.refreshForecast();
    setLoading(true); // <- I was missing this
}
...