Следующий Как установить свойство обновления SwipeRefreshLayout с помощью привязки данных Android? Я пытаюсь связать SwipeRefreshLayout
используя привязку данных, но прогресс SwipeRefreshLayout не скрывается. Ниже мой код, который я использую:
ViewModel
public class StateViewModel extends BaseViewModel {
public MutableLiveData<Boolean> isLoading;
public void getItemStateDetails() {
isLoading.setValue(true);
scanTypePosition.setValue(0);
getCompositeDisposable().add(
getRepositoryManager().getItemStates()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(this::onSuccess, this::onError));
}
private void onError(Throwable throwable) {
isLoading.setValue(false);
errorMsg.setValue(throwable.getMessage());
}
private void onSuccess(List<State> states) {
isLoading.setValue(false);
lstState.setValue(states);
}
}
раскладка
<variable
name="stateModel"
type="story.stateupdate.stateselection.StateViewModel" />
<android.support.v7.widget.CardView
android:layout_width="match_parent"
android:layout_height="match_parent"
apps:cardUseCompatPadding="true">
<android.support.v4.widget.SwipeRefreshLayout
android:id="@+id/pullToRefresh"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:onRefreshListener="@{() -> stateModel.getItemStateDetails()}"
app:refreshing="@{stateModel.isLoading}">
<android.support.v7.widget.RecyclerView
android:id="@+id/stateRecyclerView"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</android.support.v4.widget.SwipeRefreshLayout>
</android.support.v7.widget.CardView>
В приведенном выше коде переменная isLoading
изменяется с true
на false
но прогресс все еще виден. Кто-нибудь может указать, какую ошибку я делаю?
Я думаю, что вы должны попытаться обновить SwipeRefreshLayout
помощью SwipeRefreshLayout.post()
:
SwipeRefreshLayout.post(new Runnable() {
@Override
public void run() {
SwipeRefreshLayout.setRefreshing(isLoading);
}
});
Или вы можете попробовать создать собственное представление, которое расширяется из SwipeRefreshLayout
как 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);
}
});
}
}
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);
}
}