MVVM + 数据绑定 + 视图模型不更新视图
MVVM + Data Binding + View Model not updating view
我遇到了一个奇怪的问题。我想根据加载数据为 swipeRefreshLayout 设置刷新。所以我有一个监听器,它根据获取的数据获得 true/false。然后它转到设置了 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
.../>
我不认为它不工作的原因是网络连接。但事实就是如此,我注意到它不起作用。当应用程序启动时,侦听器发送值 true 而不是 false 并且它正在运行。但是当通过滑动启动刷新时,它不起作用。我怀疑 viewModel 以某种方式与布局断开连接。
我成功了!
问题是当我没有互联网连接并刷新时,我的侦听器返回 false。这部分我不确定,但我认为因为我的 ObservableBoolean 没有改变状态(保持 false),它对滑动布局没有影响,所以滑动布局在内部设置刷新为真,而我的 ObservableBoolean 为假.
所以我必须在开始刷新数据后立即将此值设置为 true。
这是我的 ViewModel 方法
public void onRefresh() {
Log.d(TAG, "onRefresh: ");
MainLib.refreshForecast();
setLoading(true); // <- I was missing this
}
我遇到了一个奇怪的问题。我想根据加载数据为 swipeRefreshLayout 设置刷新。所以我有一个监听器,它根据获取的数据获得 true/false。然后它转到设置了 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
.../>
我不认为它不工作的原因是网络连接。但事实就是如此,我注意到它不起作用。当应用程序启动时,侦听器发送值 true 而不是 false 并且它正在运行。但是当通过滑动启动刷新时,它不起作用。我怀疑 viewModel 以某种方式与布局断开连接。
我成功了!
问题是当我没有互联网连接并刷新时,我的侦听器返回 false。这部分我不确定,但我认为因为我的 ObservableBoolean 没有改变状态(保持 false),它对滑动布局没有影响,所以滑动布局在内部设置刷新为真,而我的 ObservableBoolean 为假. 所以我必须在开始刷新数据后立即将此值设置为 true。
这是我的 ViewModel 方法
public void onRefresh() {
Log.d(TAG, "onRefresh: ");
MainLib.refreshForecast();
setLoading(true); // <- I was missing this
}