Анимация обновления SwipeRefreshLayout не останавливается

Я реализовал фрагмент, который имеет SwipeRefreshLayout как представление содержимого. Анимация обновления запускается при onRefresh, но она никогда не останавливается, даже если для setRefreshing установлено значение false после получения данных с сервера.

    @Override
public void onRefresh() {
    handler.post(refreshing);
}


private final Runnable refreshing = new Runnable(){
    public void run(){
        try {
            if(isRefreshing()){
                handler.postDelayed(this, 1000);
            }else{
                swipeLayout.setRefreshing(false);
                mainActivity.forceUpdate();
                setLayout();
            }
        }
        catch (Exception e) {
            e.printStackTrace();
        }
    }
};

private boolean isRefreshing(){
    return swipeLayout.isRefreshing();
}

person blavi    schedule 28.05.2015    source источник
comment
Проверьте, выполняет ли ваш отладчик swipeLayout.setRefreshing(false)   -  person Gowtham Kumar    schedule 28.05.2015
comment
Кажется, что onRefresh не вызывается при вертикальном свайпе. Отладчик не останавливается на onRefresh   -  person blavi    schedule 28.05.2015
comment
Попробуйте swipeLayout.setOnRefreshListner(new SwipeRefreshLayout.OnRefreshListner()){ //здесь будет переопределен ваш метод onrefresh }   -  person Gowtham Kumar    schedule 28.05.2015
comment
есть твой setRefreshing(true)?   -  person Oleg Osipenko    schedule 28.05.2015


Ответы (8)


ну конечно не переставая обновляться, посмотри на свой шлейф.

if(isRefreshing()){
    handler.postDelayed(this, 1000);
}else{
    swipeLayout.setRefreshing(false);
    mainActivity.forceUpdate();
    setLayout();
}

в основном вы никогда не останавливаете его, "swipeLayout.setRefreshing(false);" никогда не вызывается, так как условие, которое ему нужно, (isRefreshing()) должно быть ложным, поэтому это не имеет никакого смысла, вы всегда получите истинное значение от "isRefreshing()", поскольку вы никогда не говорите ему останавливаться . УстановитьRefreshing в false на основе логического значения isRefreshing, на мой взгляд, неправильно, вы не должны полагаться на него, вы должны сами решать, когда вы хотите остановить состояние обновления.

обычно PullToRefresh используется для получения новых данных с сервера. поэтому в основном я бы рекомендовал вставить эту проверку прямо там, где вы получаете ответ с вашего сервера:

if (swipeLayout.isRefreshing()) {
     swipeLayout.setRefreshing(false);
}

потому что как только вы получите новые данные с сервера, вам нужно прекратить обновление.

EDIT — добавлен полный пример кода

protected SwipeRefreshLayout.OnRefreshListener mOnRefreshListener = new SwipeRefreshLayout.OnRefreshListener() {
    @Override
    public void onRefresh() {
        retrieveDocuments();
    }
};

public void retrieveDocuments() {
//some code, server call

//onCompletion is your server response with a success
@Override
public void onCompletion(String result) {

    if (mSwipeRefreshLayout.isRefreshing()) {
       mSwipeRefreshLayout.setRefreshing(false);
    }
}

}
person JozeRi    schedule 28.05.2015

Это удалит анимацию:

mSwipeRefreshLayout.setRefreshing(false);
person Rishabh Srivastava    schedule 28.05.2015

Используйте setRefreshing(false) в потоке пользовательского интерфейса.

Попробуй это:

Handler mHandler = new Handler();//In UI Thread

...

mHandler.postDelayed(new Runnable() {
    @Override
    public void run() {
        swipeLayout.setRefreshing(isRefreshing);
    }
}, delayTime);
person user4470672    schedule 20.07.2015
comment
.runOnUiThread(new Runnable() { @Override public void run() { mSwipeRefreshCurrent.setRefreshing(false); } }); работает на меня! - person user1612540; 15.11.2015
comment
Спасибо, user1612549, похоже, у меня тоже сработало. - person Erik K.; 25.07.2017

В моем случае я сделал

mSwipeRefreshLayout.post(new Runnable() {
                @Override
                public void run() {
                    mSwipeRefreshLayout.setRefreshing(true);
                }
            });

дважды. Тогда он не удаляется

mSwipeRefreshLayout.setRefreshing(false);
person iftach barshem    schedule 13.06.2017

если вы хотите остановить загрузку анимации при загрузке страницы, вам нужно сначала найти это, когда страница полностью загружена в Webview.

Вот полный код для загрузки страницы в Webview, а затем остановки загрузки анимации после полной загрузки страницы.

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_web_view);


    final WebView wvSocialMediaPage = findViewById(R.id.wv_social_media_page);
    wvSocialMediaPage.setWebViewClient(new CustomWebViewClient());
    WebSettings webSetting = wvSocialMediaPage.getSettings();
    webSetting.setJavaScriptEnabled(true);
    webSetting.setDisplayZoomControls(true);
    wvSocialMediaPage.loadUrl("https://facebook.com");

    swipeRefreshLayout = (SwipeRefreshLayout) this.findViewById(R.id.swipe_container);
    swipeRefreshLayout.setOnRefreshListener(
            new SwipeRefreshLayout.OnRefreshListener() {
                @Override
                public void onRefresh() {
                    wvSocialMediaPage.reload();
                }
            }
    );
}



    private class CustomWebViewClient extends WebViewClient {
    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        view.loadUrl(url);
        return true;
    }

    @Override
    public void onPageFinished(WebView view, String url) {
        swipeRefreshLayout.setRefreshing(false);
    }
}

onPageFinished обнаружит, когда страница успешно загружена, а затем остановит анимацию.

person Ehsan Rafique    schedule 28.01.2018

Убедитесь, что ваш слушатель настроен.

mSwipeRefreshLayout = findViewById(R.id.swiperefresh);
mSwipeRefreshLayout.setOnRefreshListener(this); // Important
person Rejinderi    schedule 19.10.2018

Не люблю слушателей. Я действительно думаю, что если вы кодируете на С#, вы должны следовать его парадигмам. Одним из них являются события. MvxSwipeRefreshLayout имеет событие Refresh. И что вы можете сделать в его обработчике, так это сделать некоторые вещи, которые требуют некоторого времени, например, ждать его, а затем установить Refreshing в false.

    private async void SwipeToRefreshControl_Refresh(object sender, EventArgs e)
    {
        await ...some stuff here...
        (sender as MvxSwipeRefreshLayout).Refreshing = false;
    }
person Yaroslav Pelyukh    schedule 21.02.2019

Если вы используете Kotlin, вы можете сделать это с помощью Coroutines.

Где binding.dashboardRefresh — это мой SwipeRefreshLayout.

    //Refresh the info on Swipe-Refresh
    binding.dashboardRefresh.run {
        setOnRefreshListener {
            menuViewModel.getFields()
            val workerScope = CoroutineScope(Dispatchers.IO)
            workerScope.launch {
                delay(3000)
                isRefreshing = false
            }
        }
    }
person Favour Felix Chinemerem    schedule 21.12.2019