2015-09-08 6 views
11

ho SwipeRefreshLayout come in questo modo:SwipeRefreshLayout tirare più volte il comportamento (SDK 23)

.xml:

<android.support.v4.widget.SwipeRefreshLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/swipe_refresh_layout" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" > 

    <android.support.v7.widget.RecyclerView 
     android:id="@+id/haberRecyclerView" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" /> 
</android.support.v4.widget.SwipeRefreshLayout> 

.java:

private SwipeRefreshLayout swipeLayout; 
swipeLayout = (SwipeRefreshLayout) rootView.findViewById(R.id.swipe_refresh_layout); 
     swipeLayout.setColorSchemeColors(getResources().getColor(R.color.primary_color)); 
     swipeLayout.setOnRefreshListener(new OnRefreshListener() { 
      @Override 
      public void onRefresh() { 
       refreshContent(); 
      } 
     }); 

Questo mi permette tirare swipeRefreshpiù volte a ND girando l'animazione diventa strano, a volte rimane sullo schermo senza circuitazione:

enter image description here

Al primo tiro appare un po 'in alto, al secondo tiro va giù un po' più come come sull'immagine.

Come disabilitare pull multiplo su SwipeRefresh mentre è già in corso l'aggiornamento? Immagino che questo non accada sotto sdk 23. Sto usando buildTool 23, targetSdk 23, support-v4: 23, appcompat-v7: 23.

Aggiornamento: questo non accade se uso ListView anziché RecyclerView.

risposta

12

Questo problema è stato introdotto a sostegno-v4 23.0.0 ed è causato dalla nuova funzionalità non nidificato scorrimento controllando se isRefreshing().

Si dovrebbe estendere SwipeRefreshLayout e sovrascrivere la funzione onStartNestedScroll:

@Override 
public boolean onStartNestedScroll(View child, View target, int nestedScrollAxes) { 
    return !isRefreshing() && super.onStartNestedScroll(child, target, nestedScrollAxes); 
} 
+0

Grazie. funziona bene –

0

aggiungi variabile booleana per controllare l'elenco in modo che sia aggiornato in questo momento.

if (!refreshing) 
refreshContent(); 
+0

Sì, ma dove, come sapere se sto tirando la seconda volta? Oltre a questo ho recyclerView che ha anche il pull –

+0

Il mio problema non è l'aggiornamento del contenuto, ma swipeRefresh. Non dovrebbe permettermi di tirare mentre è già rinfrescante –

+0

hm. Strano. Sto usando anche questo, ma non ho avuto questo problema. Hai aggiunto swipeLayout .setOnRefreshListener (questo) ;? –

0

si potrebbe creare una sottoclasse SwipeRefreshLayout fornendo l'implementazione personalizzata di canChildScrollUp()

@Override 
public boolean canChildScrollUp() { 
    if (isRefreshing()) { 
     return true; 
    } 
    return false; 
} 

, naturalmente, si dovrebbe verificare se la vostra vista riciclatore sta mostrando già il suo primo figlio e restituire un valore di conseguenza

+0

Questo metodo è correlato a se il bambino può scorrere in determinati casi. Questo viene chiamato quando si tira il dito? –

+0

Lo fa. Fare un tentativo – Blackbelt

+0

Non compilare) –

-1

È necessario chiamare mSwipeRefreshLayout.stopRefreshing() al termine dell'aggiornamento dei dati.

public void refreshContent() { 
... 
//end of your "refresh" code 

if(mSwipeRefreshLayout.isRefreshing()) 
    mSwipeRefreshLayout.stopRefreshing() 
} 
+0

Lo faccio, il problema è diverso :) –

+0

Potresti provare se funziona sotto v23? Ci sono un sacco di cose che non funzionano allo stesso modo su v23, ho anche qualche problema con esso ... –

+0

Sull'altro progetto con buildToolsVersion "22.0.1", targetSdk 22, appcompat-v7: 22.1.0 ' funziona correttamente –

1

Sembra un errore nella libreria di supporto appcompat-v7 introdotta nella versione 23.0.0. Come soluzione alternativa è possibile disattivare SwipeRefreshLayout in OnRefreshListener # onRefresh callback e attivare di nuovo quando viene caricato i dati:

private class MyOnRefreshListener implements SwipeRefreshLayout.OnRefreshListener { 

    @Override 
    public void onRefresh() { 
     swipeRefreshLayout.setEnabled(false); 
     load(); 
    } 

    private void onLoaded() { 
     swipeRefreshLayout.setEnabled(true); 
     swipeRefreshLayout.setRefreshing(false); 
    } 
} 
+0

come si usa 'onLoaded()'? –

+0

1 modo è di chiamarlo sul metodo load() ogni volta, dopo che è stato caricato. –

+0

non funziona ancora allo stesso momento –

5

"supporto-v4: 23.1.0" già risolto questo bug.

+0

Sì, funziona correttamente su 23.1.0 –

Problemi correlati