SwipeRefreshLayout刷新动画不会停止

bla*_*avi 8 android 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();
}
Run Code Online (Sandbox Code Playgroud)

Joz*_*eRi 22

好吧,当然它不会停下来刷新,看看你的循环.

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

基本上你永远不会停止它,"swipeLayout.setRefreshing(false);" 永远不会被调用,因为它需要的条件是(isRefreshing())是假的,所以它没有任何意义,你总是从"isRefreshing()"获得一个真值,因为你永远不会告诉它停止.基于isRefreshing的布尔值setRefreshing为false在我看来是错误的,你不应该依赖它,你应该决定何时想要停止刷新状态.

通常PullToRefresh用于从服务器获取新数据.所以基本上我建议在你从服务器得到答案的地方插入这个检查:

if (swipeLayout.isRefreshing()) {
     swipeLayout.setRefreshing(false);
}
Run Code Online (Sandbox Code Playgroud)

因为一旦从服务器获取新数据,就需要停止刷新.

编辑 - 添加了完整的代码示例

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

}
Run Code Online (Sandbox Code Playgroud)


Ris*_*ava 9

这将删除动画:

mSwipeRefreshLayout.setRefreshing(false);
Run Code Online (Sandbox Code Playgroud)


use*_*672 6

setRefreshing(false)在UI线程中使用。

尝试这个:

Handler mHandler = new Handler();//In UI Thread
Run Code Online (Sandbox Code Playgroud)

...

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