Прогресс SwipeRefreshLayout не скрывается при использовании привязки данных

1

Следующий Как установить свойство обновления 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 но прогресс все еще виден. Кто-нибудь может указать, какую ошибку я делаю?

Теги:
android-livedata
swiperefreshlayout

2 ответа

1
Лучший ответ

Я думаю, что вы должны попытаться обновить 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);
            }
        });
    }
}
  • 0
    Спасибо за ваше предложение, но мне нужно сделать это, используя мой XML-файл.
  • 0
    @Praneshsaw: я обновил свой ответ
0
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);
    }
}
  • 0
    Не может иметь ссылку на объект SwipeRefreshLayout в моем stateViewModel, так как будут шансы утечки памяти.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню