web-dev-qa-db-fra.com

SwipeRefreshLayout déclenchent par programme

Est-il possible de déclencher la SwipeRefreshLayout par programme? L'animation doit démarrer et la méthode onRefresh de l'interface OnRefreshListener doit être appelée.

55
Niklas

si vous utilisez le nouveau swipeRefreshLayout présenté dans la version 5.0 enter image description here

En tant qu’image montrée ci-dessus, il vous suffit d’ajouter la ligne suivante pour déclencher par programme la mise à jour du balayage 

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

si vous appelez simplement 

 mSwipeRefreshLayout.setRefreshing(true);

cela ne déclenchera pas l'animation du cercle, donc en ajoutant la ligne ci-dessus, il suffit de faire un délai dans le thread d'interface utilisateur pour qu'il affiche l'animation du cercle à l'intérieur du thread ui. 

En appelant mSwipeRefreshLayout.setRefreshing(true), la OnRefreshListener sera NE sera PAS exécuté

Pour arrêter l'appel de l'animation de chargement circulaire mSwipeRefreshLayout.setRefreshing(false)

126
Ramz

Afin de déclencher SwipeRefreshLayout j'ai essayé cette solution:

SwipeRefreshLayout.OnRefreshListener swipeRefreshListner = new SwipeRefreshLayout.OnRefreshListener() {
        @Override
        public void onRefresh() {
            Log.i(TAG, "onRefresh called from SwipeRefreshLayout");
            // This method performs the actual data-refresh operation.
            // The method calls setRefreshing(false) when it's finished.
            loadData();
        }
    };

Maintenant élément clé:

swipeLayout.post(new Runnable() {
@Override public void run() {
     swipeLayout.setRefreshing(true);
     // directly call onRefresh() method 
     swipeRefreshListner.onRefresh();
   }
});
23
Min2

Juste pour forcer ajouter ces deux pour permettre le geste de glisser 

swipeRefreshLayout.setOnRefreshListener(
    new SwipeRefreshLayout.OnRefreshListener() {
        @Override
        public void onRefresh() {
            Log.i(TAG, "onRefresh called from SwipeRefreshLayout");

            // This method performs the actual data-refresh operation.
            // The method calls setRefreshing(false) when it's finished.
            FetchData();
        }
    }
);
0
Goodlife

Vous pouvez appeler la méthode onRefresh () par programme puis, à l'intérieur de la méthode, démarrez l'animation si ce n'est déjà fait. Voir ce qui suit:

@Override
public void onRefresh() {
    if (!mSwipeRefreshLayout.isRefreshing()) mSwipeRefreshLayout.setRefreshing(true);
    //TODO
}
0
user7010102