首页 > 解决方案 > MVVM + 数据绑定 + 视图模型不更新视图

问题描述

我有一个奇怪的问题。我想根据加载数据为 swipeRefreshLayout 设置刷新。所以我有一个监听器,它根据获取数据获得真/假。然后它转到设置了 ObservableBoolean 的 ViewModel,并且由于 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
        }

这是我的视图模型。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 以某种方式与布局断开了连接。

标签: javaandroidandroid-databindingandroid-architecture-componentsandroid-viewmodel

解决方案


我已经成功了!

问题是当我没有互联网连接并且我刷新时,我的听众返回错误。这部分我不确定,但我认为因为我的 ObservableBoolean 没有改变状态(保持为假),它对滑动布局没有影响,所以在我的 ObservableBoolean 为 false 时,滑动布局内部设置刷新为 true . 所以我必须在开始刷新数据后将此值设置为 true。

这是我的 ViewModel 方法

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

推荐阅读