我使用改造2 + RxJava2 +数据绑定库。
我想在执行api调用时更新进度条的可见性。
在onNext / onError / onCompleted回调中修改模型时,视图不会更新。在订阅中,它有效。执行我修改模型的代码行。可能是什么问题?
模型类+一些助手
public class RxUtils {
public static <T> ObservableTransformer<T, T> applyApiSchedulers() {
return new ObservableTransformer<T, T>() {
@Override
public ObservableSource<T> apply(@NonNull Observable<T> upstream) {
return upstream.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread());
}
};
}
}
public class CompanyActivityModel extends BaseObservableModel {
private boolean isLoading = false;
private final ArrayList<Company> companies;
public CompanyActivityModel() {
this.companies = new ArrayList<>();
}
@Bindable
public boolean isLoading() {
return isLoading;
}
public void setLoading(boolean loading) {
isLoading = loading;
notifyPropertyChanged(BR.isVisible);
}
public ArrayList<Company> getCompanies() {
return companies;
}
}
public class BaseObservableModel extends BaseObservable {
}
进度条布局+活动布局
<data>
<import type="android.view.View"/>
<variable
name="isVisible"
type="boolean"/>
</data>
<RelativeLayout
android:visibility="@{isVisible ? View.VISIBLE : View.GONE}"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#FFFFFF">
<ProgressBar
android:layout_centerInParent="true"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</RelativeLayout>
</layout>
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:bind="http://schemas.android.com/tools">
<data>
<variable
name="model"
type=".CompanyActivityModel"/>
</data>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.v7.widget.RecyclerView
android:id="@+id/rv_companies"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
<include
app:isVisible = "@{model.loading}"
layout="@layout/layout_progress_bar"/>
</RelativeLayout>
</layout>
api电话
apiService.getAllCompanies(null)
.compose(RxUtils.applyApiSchedulers())
.subscribe(new Observer<GetAllCompaniesResponse>() {
@Override
public void onSubscribe(@NonNull Disposable d) {
getModel().setLoading(true);
}
@Override
public void onNext(@NonNull GetAllCompaniesResponse getAllCompaniesResponse) {
if(!getAllCompaniesResponse.hasError()) {
companyDao.insertCompanies(getAllCompaniesResponse.getResult());
}
getModel().setLoading(false);
}
@Override
public void onError(@NonNull Throwable e) {
getModel().setLoading(false);
}
@Override
public void onComplete() {
getModel().setLoading(false);
loadCompaniesFromDB();
}
});
答案 0 :(得分:0)
ln -s
BR值是根据notifyPropertyChanged(BR.isVisible);
注释生成的,而不是布局XML中的名称。所以你告诉数据绑定库错误的变量正在更新。
@Bindable
可能是应该提供的正确值。