5

Ho un'attività che consiste in una barra degli strumenti e un cercapersone vista. Essa è strutturata come segue:SwipeRefreshLayout all'interno ViewPager

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:orientation="vertical"> 

<android.support.v4.view.ViewPager 
    android:id="@+id/pager" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:paddingTop="112dp" 
    android:layout_gravity="bottom" 
    tools:context=".Rhino68PanelActivity" /> 

<LinearLayout 
    android:id="@+id/toolbarContainer" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:orientation="vertical"> 

    <include 
     android:id="@+id/app_bar" 
     layout="@layout/app_bar" /> 

    <include 
     android:id="@+id/tap_strip" 
     layout="@layout/tab_strip" /> 

</LinearLayout> 

Poi caricare due frammenti nel pager vista. Ogni frammento contiene il proprio SwipeRefreshLayout. Vi mostrerò un layout frammenti:

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

<LinearLayout 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" 
    android:weightSum="12" 
    tools:context=".Rhino68PanelActivity$DummySectionFragment"> 
    ...   
    <android.support.v7.widget.RecyclerView 
    android:id="@+id/recyclerView_panel_status" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:clipToPadding="false" /> 

</LinearLayout> 

Ora quando faccio funzionare l'attività sembra funzionare. Tuttavia ho notato che sto scorrendo orizzontalmente (cioè per andare alla scheda successiva). Si innesca la swipeRefreshLayout OnRefreshListener

 mSwipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { 
      @Override 
      public void onRefresh() { 
       mSwipeRefreshLayout.setRefreshing(true); 
       DoUpdate(); 
      } 
     }); 

sto vivendo anche comportamento visivo strano quando io cerco di fare un aggiornamento. Il segno di caricamento (cerchio rotante) spesso non mostra, e a volte mostra ma rimane piccolo. Non sono sicuro che questa sia anche la causa delle due opinioni in conflitto tra loro.

C'è un modo per risolvere il problema. Non sono sicuro di come. Forse limitando lo SwipeRefreshLayout per ascoltare solo gli swip verticali?

Qualsiasi suggerimento sarà molto apprezzato.

+1

Non ho questo problema all'interno del mio progetto, che utilizza anche una struttura simile. Puoi pubblicare un progetto di esempio che riproduce questo problema? – corsair992

+0

Ti piacerebbe condividere il tuo layout? Sicuramente i due layout interferiranno l'uno con l'altro? Se ho appena registrato il 'SwipeRefreshLayout', si attiverà' OnRefresh() ' – Zapnologica

+1

C'è un intervallo di inclinazione prima che uno di questi' ViewGroup' subisca l'evento di tocco, ed è determinato dal fatto che il trascinamento sia più verticale o orizzontale . Una volta che un evento touch è stato preso da un 'ViewGroup', continua a gestire l'evento senza interferenze (usando il metodo' requestDisallowInterceptTouchEvent() '). La mia app e il layout sono abbastanza complicati e anche confidenziali, sarebbe di grande aiuto se potessi pubblicare un progetto di esempio minimale con questo problema (in modo che io possa eseguirne il debug). – corsair992

risposta

1

È perché c'è un errore in SwipeRefreshLayout! Il bug è "onRefresh non funziona correttamente se l'onMeasure non si chiama" Si dovrebbe estende SwipeRefreshLayout come questo!

public class SwipeRefreshLoading extends SwipeRefreshLayout { 
    public SwipeRefreshLoading(Context context) { 
     super(context, null); 
    } 

    public SwipeRefreshLoading(Context context, AttributeSet attrs) { 
     super(context, attrs); 
    } 

    private boolean mMeasured = false; 
    private boolean mPreMeasureRefreshing = false; 

    @Override 
    public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
     super.onMeasure(widthMeasureSpec, heightMeasureSpec); 
     if (!mMeasured) { 
      mMeasured = true; 
      setRefreshing(mPreMeasureRefreshing); 
     } 
    } 


    @Override 
    public void setRefreshing(boolean refreshing) { 
     if (mMeasured) { 
      super.setRefreshing(refreshing); 
     } else { 
      mPreMeasureRefreshing = refreshing; 
     } 
    } 
} 
+0

Grazie! Ho RefreshLayout all'interno di ViewPager e 'setRefreshing' all'interno di" pagina "(era un frammento nel mio caso) non funziona per alcuni motivi. A proposito, io uso il tuo frammento di codice e ho ottenuto un po 'di posizione sbagliata di spinner rinfrescante. Se sposti la logica dal metodo 'onMeasure' a' onLayout', la posizione sarà corretta. – IlyaEremin

+0

@IlyaEremin ho un problema in vievpager con refreshlayout - quando ho triger onrefresh * setrefresg (false) nel primo frammento di viewpager l'animazione è scomparsa (è ok) - ma nell'animazione del secondo frammento è ancora in esecuzione anche io ho chiamato setrefreshinng (false) - Ho esteso il layout come sopra - anche spostato su onlayout ma ancora nessun effetto ha anche provato post in ritardo sul layout - forse dovrei aggiungere setrefresh a lay out? – ceph3us

+0

@TomaszBest questa è una domanda stupida, ma chiedo. Hai chiamato 'setRefreshing (false)' per il secondo frammento 'SwipeRefreshLayout'? – IlyaEremin

3

Ho anche avuto questo stupido problema. Sembra un bug in SwipeRefreshLayout. Come soluzione temporanea, ho dovuto rimuovere tutte le sue viste secondarie nel metodo Fragment.onDestroyView().

public SwipeRefreshLayout mSwipeRefreshLayout; 
... 

@Override public void onDestroyView() { 
    mSwipeRefreshLayout.removeAllViews(); 
    super.onDestroyView(); 
} 
Problemi correlati