Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/178.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android SwipeRefreshLayout刷新动画不';停不下来_Android_Swiperefreshlayout - Fatal编程技术网

Android SwipeRefreshLayout刷新动画不';停不下来

Android SwipeRefreshLayout刷新动画不';停不下来,android,swiperefreshlayout,Android,Swiperefreshlayout,我已经实现了一个片段,它有一个SwiperFreshLayout作为内容视图。刷新动画在onRefresh时触发,但即使从服务器检索数据后将setRefresh设置为false,它也不会停止 @Override public void onRefresh() { handler.post(refreshing); } private final Runnable refreshing = new Runnable(){ public void run(){

我已经实现了一个片段,它有一个SwiperFreshLayout作为内容视图。刷新动画在onRefresh时触发,但即使从服务器检索数据后将setRefresh设置为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();
}

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

if(isRefreshing()){
    handler.postDelayed(this, 1000);
}else{
    swipeLayout.setRefreshing(false);
    mainActivity.forceUpdate();
    setLayout();
}
基本上你永远不会停止, “swipeLayout.setRefreshing(false);” 永远不会调用,因为它需要的条件(isRefreshing())为false,所以它没有任何意义,您将始终从“isRefreshing()”中获得一个真值,因为您从未告诉它停止。 根据isRefreshing的布尔值将Refreshing设置为false在我看来是错误的,您不应该依赖它,应该由您决定何时停止刷新状态

通常,PullToRefresh用于从服务器获取新数据。 因此,基本上,我建议将此检查插入从服务器获得答案的位置:

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

}

这将删除动画:

mSwipeRefreshLayout.setRefreshing(false);
在UI线程中使用
setRefreshing(false)

试试这个:

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

就我而言,我做到了

mSwipeRefreshLayout.post(new Runnable() {
                @Override
                public void run() {
                    mSwipeRefreshLayout.setRefreshing(true);
                }
            });
两次。 然后,它不会被删除

mSwipeRefreshLayout.setRefreshing(false);

若要在页面加载时停止加载动画,则必须首先在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将在页面加载成功时找到,然后停止动画。

确保设置了侦听器

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

我不喜欢听众。我确实认为,如果你用c语言编写代码,你必须遵循它的范例。其中之一就是事件。MvxSwipeRefreshLayout具有名为Refresh的事件。 您可以在其处理程序中执行一些需要一些时间的操作,比如等待,然后将刷新设置为false

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

如果您使用Kotlin,您可以通过协同程序来实现这一点

其中,
binding.dashboardRefresh
是我的SwiperFreshLayout

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

检查调试器是否执行swipeLayout.setRefreshing(false)垂直滑动时似乎未调用onRefresh。调试器不会在onRefreshTry swipeLayout.setOnRefreshListner(新的SwipeRefreshLayout.OnRefreshListner()){//您的onrefresh方法将在此处被重写}这里有您的
SetRefresh(true)
?.runUnuithread(新的Runnable(){@Override public void run()){mSwipeRefreshCurrent.setRefreshing(false);}}});适合我!谢谢,user1612549,看起来它也适合我。
    //Refresh the info on Swipe-Refresh
    binding.dashboardRefresh.run {
        setOnRefreshListener {
            menuViewModel.getFields()
            val workerScope = CoroutineScope(Dispatchers.IO)
            workerScope.launch {
                delay(3000)
                isRefreshing = false
            }
        }
    }