web-dev-qa-db-fra.com

L'animation d'actualisation SwipeRefreshLayout ne s'arrête pas

J'ai implémenté un fragment qui a un SwipeRefreshLayout en tant que vue de contenu. L'actualisation de l'animation est déclenchée à onRefresh mais elle ne s'arrête jamais, même si setRefreshing est défini sur false après la récupération des données du serveur.

    @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();
}
6
blavi

eh bien, bien sûr, il ne s’arrête pas pour rafraîchir, regardez votre boucle.

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

fondamentalement, vous ne l'arrêtez jamais, "swipeLayout.setRefreshing (false);" n'est jamais appelé, car la condition dont il a besoin est (isRefreshing ()) pour être fausse, elle ne le vaut donc pas. Cela n’a aucun sens, vous obtiendrez toujours une valeur vraie de "isRefreshing ()" puisque vous ne dites jamais que cela s’arrête. setRefreshing à false en fonction de la valeur booléenne de isRefreshing est erronée à mon avis, vous Si vous ne devez pas vous y fier, c’est à vous de décider à quel moment arrêter l’actualisation.

habituellement PullToRefresh est utilisé pour obtenir de nouvelles données du serveur. . En gros, je vous recommande donc d'insérer cette vérification à l'endroit où vous obtenez une réponse de votre serveur:

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

car une fois que vous obtenez vos nouvelles données sur le serveur, vous devez arrêter d’actualiser vos données.

EDIT - ajout d'un exemple de code complet

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

}
21
JozeRi

Cela supprimera l'animation:

mSwipeRefreshLayout.setRefreshing(false);
9

Dans mon cas j'ai fait 

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

deux fois. Ensuite, il n'est pas supprimé par 

mSwipeRefreshLayout.setRefreshing(false);
3
iftach barshem

si vous souhaitez arrêter le chargement de l'animation lorsque la page est chargée, vous devez d'abord trouver cette information lorsque la page est complètement chargée dans Webview.

Voici le code complet pour charger une page dans Webview, puis arrêter de charger l'animation après le chargement complet de la page.

@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 trouvera quand la page est chargée avec succès puis arrêtez l'animation.

3
Ehsan Rafique

Utilisez setRefreshing(false) dans le fil de l'interface utilisateur.

Essaye ça:

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

...

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

Assurez-vous que votre auditeur est défini. 

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

N'aime pas les auditeurs. Je pense que si vous codez en c #, vous devez suivre ses paradigmes. Un de ces événements est. MvxSwipeRefreshLayout a un événement appelé Refresh. Et ce que vous pouvez faire dans son gestionnaire est de faire des choses qui prennent un certain temps, comme attendre, puis de définir Rafraîchir sur false.

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