SwipeRefreshLayout刷新动画无法停止

17

我实现了一个片段,其中包含一个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();
}

检查您的调试器是否执行了 swipeLayout.setRefreshing(false)。 - Gowtham Kumar
似乎在竖向滑动时没有调用onRefresh。调试器不会停在onRefresh处。 - blavi
尝试使用以下代码: swipeLayout.setOnRefreshListner(new SwipeRefreshLayout.OnRefreshListner()){ //在此处重写您的onrefresh方法 } - Gowtham Kumar
1
你的 setRefreshing(true) 在哪里? - Oleg Osipenko
8个回答

27

当然它不会停止刷新,看看你的循环。

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

基本上,您永远不会停止它,“swipeLayout.setRefreshing(false);”从未被调用,因为它需要的条件(isRefreshing()为false)始终是真的,所以它没有任何意义,您将始终从“isRefreshing()”中获取一个真值,因为您从未告诉它停止。在我的观点中,根据isRefreshing的布尔值将setRefreshing设置为false是错误的,您不应该依赖它,您应该自己决定何时停止刷新状态。

通常,下拉刷新用于从服务器获取新数据。因此,我建议在从服务器获取答案的位置插入此检查:

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

因为一旦你从服务器获取到新数据,那么就需要停止刷新。

修改 - 添加完整的代码示例

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);
    }
}

}

15

这将移除动画:

mSwipeRefreshLayout.setRefreshing(false);

6

在 UI 线程中使用 setRefreshing(false)

尝试这样做:

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

...

mHandler.postDelayed(new Runnable() {
    @Override
    public void run() {
        swipeLayout.setRefreshing(isRefreshing);
    }
}, delayTime);

.runOnUiThread(new Runnable() { @Override public void run() { mSwipeRefreshCurrent.setRefreshing(false); } }); 对我很有效! - user1612540
谢谢,user1612549,看起来对我也有效。 - Erik K.

3

如果你想在页面加载完成后停止加载动画,那么你需要先找到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函数将停止动画。


3
在我的情况下,我这样做了。
mSwipeRefreshLayout.post(new Runnable() {
                @Override
                public void run() {
                    mSwipeRefreshLayout.setRefreshing(true);
                }
            });

两次。 然后,它不会被

移除。

mSwipeRefreshLayout.setRefreshing(false);

0

确保你的监听器已经设置。

mSwipeRefreshLayout = findViewById(R.id.swiperefresh);
mSwipeRefreshLayout.setOnRefreshListener(this); // Important

0

不喜欢监听器。我认为如果你在编写C#代码,你必须遵循它的范例之一:事件。MvxSwipeRefreshLayout有一个名为Refresh的事件。 在其处理程序中可以执行一些需要时间的操作,例如等待,然后将Refreshing设置为false。

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

0
如果您使用Kotlin,您可以使用协程来完成此操作。
其中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
            }
        }
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接