Android 使用数据绑定时未隐藏布局进度

Android 使用数据绑定时未隐藏布局进度,android,android-livedata,swiperefreshlayout,Android,Android Livedata,Swiperefreshlayout,接下来,我尝试使用数据绑定绑定SwipeRefreshLayout,但SwipeRefreshLayout的进度并没有被隐藏。 下面是我正在使用的代码: 视图模型 公共类StateViewModel扩展了BaseViewModel{ 公共可变LiveData isLoading; public void getItemStateDetails(){ isLoading.setValue(真); scanTypePosition.setValue(0); getCompositeDisposabl

接下来,我尝试使用数据绑定绑定
SwipeRefreshLayout
,但SwipeRefreshLayout的进度并没有被隐藏。 下面是我正在使用的代码:

视图模型

公共类StateViewModel扩展了BaseViewModel{
公共可变LiveData isLoading;
public void getItemStateDetails(){
isLoading.setValue(真);
scanTypePosition.setValue(0);
getCompositeDisposable().add(
getRepositoryManager().getItemStates()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(this::onSuccess,this::onError));
} 
私人作废登记员(可丢弃){
isLoading.setValue(假);
errorMsg.setValue(throwable.getMessage());
}
私有void onSuccess(列出状态){
isLoading.setValue(假);
lstState.setValue(状态);
}
}
布局



在上面的代码中,变量
isLoading
正在从
true
更改为
false
,但过程仍然可见。有人能指出我犯了什么错误吗?

我想你应该尝试通过
SwipeRefreshLayout.post()方法更新
SwipeRefreshLayout

SwipeRefreshLayout.post(new Runnable() {
       @Override
       public void run() {
            SwipeRefreshLayout.setRefreshing(isLoading);
       }
});

或者,您可以尝试创建从
SwipeRefreshLayout
扩展的自定义视图,如下所示:

public class CustomSwipeRefreshLayout extends SwipeRefreshLayout {
    public CustomSwipeRefreshLayout(@NonNull Context context) {
        super(context);
    }

    public CustomSwipeRefreshLayout(@NonNull Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    public void setRefreshing(final boolean refreshing) {
        post(new Runnable() {
            @Override
            public void run() {
                CustomSwipeRefreshLayout.super.setRefreshing(refreshing);
            }
        });
    }
}
公共类StateViewModel扩展BaseViewModel实现SwipeRefreshLayout.OnRefreshListener{
SwipeRefreshLayout SwipeRefreshLayout;
public void getItemStateDetails(){
swipeRefreshLayout.setRefreshing(true);
scanTypePosition.setValue(0);
getCompositeDisposable().add(
getRepositoryManager().getItemStates()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(this::onSuccess,this::onError));
} 
私人作废登记员(可丢弃){
swipeRefreshLayout.setRefreshing(false);
errorMsg.setValue(throwable.getMessage());
}
私有void onSuccess(列出状态){
swipeRefreshLayout.setRefreshing(false);
lstState.setValue(状态);
}
}

谢谢你的建议,但我需要使用我的xml文件。在我的stateViewModel中不能有SwipeRefreshLayout对象的引用,因为这可能会导致内存泄漏。@Jeel尝试过,但收到的错误消息找不到属性“app:isRefreshing”的setter。为什么不将视图对象传递给方法
getItemStateDetails()
并在满足条件后以编程方式禁用它?@Jeel因为我从一些开发人员那里听说,我们应该避免在viewmodel类中引用任何类型的视图,这样我们就不会泄漏内存并使其可测试。好的,同意你的观点。还有一件事是如何从BR类更新视图。因为在整个代码中,并没有任何关于视图数据更改的通知<代码>即notifyPropertyChanged(BR.isLoading)
现在我将以编程方式执行它,比如stateFragmentBinding.pullToRefresh.SetRefresh(isLoading);稍后我将研究为什么app:refreshing=“@{stateModel.isLoading}”不起作用。谢天谢地。
SwipeRefreshLayout.post(new Runnable() {
       @Override
       public void run() {
            SwipeRefreshLayout.setRefreshing(isLoading);
       }
});
public class CustomSwipeRefreshLayout extends SwipeRefreshLayout {
    public CustomSwipeRefreshLayout(@NonNull Context context) {
        super(context);
    }

    public CustomSwipeRefreshLayout(@NonNull Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    public void setRefreshing(final boolean refreshing) {
        post(new Runnable() {
            @Override
            public void run() {
                CustomSwipeRefreshLayout.super.setRefreshing(refreshing);
            }
        });
    }
}
public class StateViewModel extends BaseViewModel implements SwipeRefreshLayout.OnRefreshListener {
 SwipeRefreshLayout swipeRefreshLayout;

 public void getItemStateDetails() {
    swipeRefreshLayout.setRefreshing ( true );
    scanTypePosition.setValue(0);
    getCompositeDisposable().add(
            getRepositoryManager().getItemStates()
                    .subscribeOn(Schedulers.io())
                    .observeOn(AndroidSchedulers.mainThread())
                    .subscribe(this::onSuccess, this::onError));
} 

private void onError(Throwable throwable) {
    swipeRefreshLayout.setRefreshing ( false);
    errorMsg.setValue(throwable.getMessage());
}

  private void onSuccess(List<State> states) {
        swipeRefreshLayout.setRefreshing ( false);
        lstState.setValue(states);
    }
}