MVVM +数据绑定+视图模型不更新视图

时间:2019-02-06 20:12:23

标签: java android android-databinding android-architecture-components android-viewmodel

我有一个奇怪的问题。我想根据加载数据为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
        }

这是我的ViewModel。 onRefresh()每次都起作用。登录setLoading()始终显示正确的值。当我没有互联网连接时,日志显示为false,但是刷新圈不会隐藏。

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
.../>

我认为它不起作用的原因不是网络连接。但这是我注意到它不起作用的情况。应用启动时,侦听器发送的真值比假值大,并且工作正常。但是,通过刷卡开始刷新时,它不起作用。我的怀疑是viewModel是以某种方式与布局断开连接。

1 个答案:

答案 0 :(得分:0)

我已经开始工作了!

问题是当我没有互联网连接并刷新时,我的听众返回false。我不确定这一部分,但我认为因为Ob​​servableBoolean不会更改状态(保持为false),所以它对滑动布局没有影响,因此,在ObservableBoolean为false的情况下,滑动布局内部将刷新设置为true 。 因此,在开始刷新数据后,我不得不将该值设置为true。

这是我的ViewModel方法

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