2014-07-05 11 views
49

Esiste un modo per attivare a livello di programmazione SwipeRefreshLayout? L'animazione dovrebbe iniziare e il metodo onRefresh dall'interfaccia OnRefreshListener dovrebbe essere richiamato.Trigger SwipeRefreshLayout a livello di programmazione

+5

Bene, questo sembra impossibile. Nel mio caso, devo chiamare 'mSwipeRefreshLayout.setRefreshing (true);' e una nuova istanza del mio AsyncTask quindi eseguirlo manualmente. Naturalmente, li ho inseriti in un metodo chiamato 'doRefresh()' e in 'onRefresh()' chiama 'doRefresh()' –

+0

Possibile duplicato di [Come attivare swiperefreshlayout in Android?] (Http://stackoverflow.com/questions/26513315/how-to-trigger-swiperefreshlayout-in-android) – opticod

+0

@opticod come si fa una domanda prima che il "possibile" duplichi un duplicato? – Niklas

risposta

110

se si utilizza la nuova swipeRefreshLayout intoduced in 5,0 enter image description here

Come l'immagine mostrata sopra è sufficiente aggiungere la seguente riga per attivare il layout di aggiornamento colpo di programmazione

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

se è sufficiente chiamare

non attiverà il cerchio per animare, quindi aggiungendo la riga sopra u solo effettuare un ritardo nella minaccia dell'interfaccia utente d in modo che mostri l'animazione del cerchio all'interno del thread ui.

Chiamando mSwipeRefreshLayout.setRefreshing(true) il OnRefreshListener sarà non si ottiene eseguito

Al fine di fermare il carico circolare di animazione chiamata mSwipeRefreshLayout.setRefreshing(false)

+0

Mi piace come non ci sia menzione di questo nei documenti? Ho avuto problemi infiniti con il segno di caricamento non visualizzato. Si può chiamare '.setRefreshing (false)' dal thread dell'interfaccia utente? – Zapnologica

+0

@Zapnologica: Sì, puoi. Lo chiamo da onPostExecute del mio AsyncTask che è stato attivato in onRefresh(). – AgentKnopf

+15

@Ramz Ho provato il tuo snippet: lo spinner mostra ma a differenza di quanto hai detto, il callback onRefresh implementato dal mio Fragment non viene chiamato quando richiamo manualmente setRefreshing (true) come hai fatto tu (Motorola Moto X 2014 Android 5+). Quindi devo impostare lo spinner per l'aggiornamento e chiamare manualmente il callback onRefresh per eseguire il mio codice di aggiornamento. – AgentKnopf

16

Per grilletto SwipeRefreshLayout ho provato questa soluzione:

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

Ora parte fondamentale:

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

Come menzionato in uno dei commenti della risposta precedente da parte di hac.jack, sembra che ci sia un bug con SwipeRefreshLayout. C'è un metodo interno setRefreshing (boolean refreshing, boolean notify) chiamato da setRefreshing (booling refreshing). Il parametro notify è impostato su false per impostazione predefinita, pertanto OnRefreshListener non viene mai aggiornato. Questa risposta è corretta per ottenere l'ascoltatore aggiornato. – Zac

+0

swipeRefreshLayout.setOnRefreshListener ( nuova SwipeRefreshLayout.OnRefreshListener() { @Override pubblico onRefresh void() { Log.i (TAG, "onRefresh chiamato da SwipeRefreshLayout"); // Questo metodo esegue l'attuale tecnica d'aggiornamento operazione // Il metodo chiama setRefreshing (false) al termine. FetchData(); } } ); – Goodlife

0

Giusto per forzare in aggiungere questo due per ennable gesto di scorrimento

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

È possibile chiamare il metodo onRefresh() di programmazione e quindi all'interno del metodo avviare l'animazione, se non è già stato avviato. Vedere quanto segue:

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