5

Ho uno RecyclerView all'interno di uno ViewPager che occupa solo la metà inferiore dello schermo e quello che voglio fare è avere lo scroll intero dello schermo se lo RecyclerView s ha ricevuto un evento di scorrimento verticale .Android: problemi di scorrimento con recyclerview all'interno di un viewpager

gerarchia dell'interfaccia utente in poche parole:

CoordinatorLayout 
    --- AppBarLayout 
     --- Toolbar 
     --- Bunch of static LinearLayouts, occupy most of screen 
     --- TabLayout 
    --- ViewPager 
     --- Fragments with RecyclerView 

Quello che ho: What I have

Per la mia comprensione, un RecyclerView è la memoria efficiente e cerca di adattarsi se stessa in qualunque spazio è disponibile in lo schermo. Nella mia app, ho un ViewPager che ospita più schede, ognuna delle quali ha un RecyclerView per visualizzare cose diverse.

Potresti per favore darmi qualche idea di cosa potrei fare per far scorrere l'intero schermo? Immagino che lo scatto migliore sia quello di aggiungere uno CollapsingToolbarLayout con parallasse al contenuto statico nel mezzo dello schermo. Ho anche provato a farlo, ma l'interfaccia utente era completamente rotta. È difficile dal momento che voglio solo il contenuto al centro dello schermo per scorrere fuori, non le barre degli strumenti in cima. Non ho avuto molta fortuna con un NestedScrollView né, a quanto pare la sua compatibilità con ViewPager e CoordinatorLayout non è straight-forward ..

quello che voglio: What I want

Main Activity Disposizione:

<android.support.design.widget.CoordinatorLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    > 

    <android.support.design.widget.AppBarLayout 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     app:layout_behavior="@string/appbar_scrolling_view_behavior" 
     > 

     <android.support.v7.widget.Toolbar 
      android:id="@+id/toolbar_contributor" 
      android:layout_width="match_parent" 
      android:layout_height="?attr/actionBarSize" 
      android:focusableInTouchMode="true"> 

      <android.support.v7.widget.SearchView 
       android:id="@+id/searchview_contributor" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:layout_centerInParent="true" 
       android:icon="@drawable/ic_search_white_24dp" 
       app:defaultQueryHint="Bla bla" 
       app:iconifiedByDefault="false"/> 

      <ImageButton 
       android:layout_width="24dp" 
       android:layout_height="24dp" 
       android:background="@android:color/transparent" 
       android:src="@drawable/ic_person_outline_black_24dp"/> 

     </android.support.v7.widget.Toolbar> 

     <LinearLayout 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:orientation="horizontal"> 

      <Button 
       android:layout_width="0dp" 
       android:layout_height="wrap_content" 
       android:layout_weight=".5" 
       android:text="La Bla"/> 

      <Button 
       android:layout_width="0dp" 
       android:layout_height="wrap_content" 
       android:layout_weight=".5" 
       android:text="Bla Bla"/> 
     </LinearLayout> 

     <LinearLayout 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:gravity="center" 
      android:orientation="vertical" 
      > 

      <!-- Bunch of stuff, but irrelevant --> 

      <android.support.design.widget.TabLayout 
       android:id="@+id/tablayout_profile" 
       android:layout_width="match_parent" 
       android:layout_height="40dp"/> 
     </LinearLayout> 

     <android.support.v4.view.ViewPager 
      android:id="@+id/viewpager_profile" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
     app:layout_behavior="@string/appbar_scrolling_view_behavior" /> 

    </android.support.design.widget.AppBarLayout> 
</android.support.design.widget.CoordinatorLayout> 

il frammento all'interno del 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.support.v7.widget.RecyclerView 
     android:id="@+id/recyclerview_photos" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" /> 
</FrameLayout> 

Grazie in anticipo!

Aggiornamento: Le risposte che ho ricevuto qui (per cui sono grato) sono arrivate un po 'troppo tardi. Se qualcuno sa qual è la risposta corretta, per favore fatemelo sapere!

risposta

1

Ho fatto qualcosa di molto simile a questo con un CollapsingToolbarLayout.

Il trucco qui è di avere due barre degli strumenti, una in alto con la searchview e un'altra che è la barra degli strumenti dedicata al layout di compressione.

La barra degli strumenti della barra di ricerca avrà app:collapseMode="pin".

La barra dei pulsanti avrà app:collapseMode="pin".

Il LinearLayout sotto la barra dei pulsanti avrà la modalità di compressione predefinita in modo che scorrerà. Puoi persino dargli un effetto di parallasse con app:collapseMode="parallax".

Il tuo TabLayout avrà app:collapseMode="pin" così scorre sotto la barra dei pulsanti e si spunta lì.

Il numero ViewPager deve trovarsi al di fuori dello CollapsingToolbarLayout e avere l'attributo app:layout_behavior="@string/appbar_scrolling_view_behavior".

Il CollapsingToolbarLayout vorrà visualizzare un titolo. Basta chiamare il numero setTitle(null) sulla barra degli strumenti che compatta e impostare il tuo vero titolo sulla barra degli strumenti di ricerca.

È possibile inserire la propria navigazione e i menu nella barra degli strumenti di ricerca e nella barra degli strumenti comprimi e dovrebbero funzionare come previsto.

Pubblicherò qualche XML in seguito; Volevo solo ottenere questa risposta.

2
public class CustomRecyclerView extends RecyclerView { 
public CustomRecyclerView(Context context) { 
    super(context); 
} 

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

public CustomRecyclerView(Context context, AttributeSet attrs, int defStyle) { 
    super(context, attrs, defStyle); 
} 

int lastEvent = -1; 

boolean isLastEventIntercepted = false; 
private float xDistance, yDistance, lastX, lastY; 

@Override 
public boolean onInterceptTouchEvent(MotionEvent e) { 
    switch (e.getAction()) { 
     case MotionEvent.ACTION_DOWN: 
      xDistance = yDistance = 0f; 
      lastX = e.getX(); 
      lastY = e.getY(); 

      break; 

     case MotionEvent.ACTION_MOVE: 
      final float curX = e.getX(); 
      final float curY = e.getY(); 
      xDistance += Math.abs(curX - lastX); 
      yDistance += Math.abs(curY - lastY); 
      lastX = curX; 
      lastY = curY; 

      if (isLastEventIntercepted && lastEvent == MotionEvent.ACTION_MOVE) { 
       return false; 
      } 

      if (xDistance > yDistance) { 

       isLastEventIntercepted = true; 
       lastEvent = MotionEvent.ACTION_MOVE; 
       return false; 
      } 
    } 

    lastEvent = e.getAction(); 

    isLastEventIntercepted = false; 
    return super.onInterceptTouchEvent(e); 
} 

}

basta cambiare la tua recyclerview da questo.

1

Sembra semplicemente che manchi l'attributo app:layout_scrollFlags. Dovresti aggiungerlo entrambi allo Toolbar e ai tuoi layout di intestazione lineari. Ad esempio, è possibile utilizzare: app:layout_scrollFlags="scroll|enterAlways"

come la vedo io, la tua ViewPager ha già app:layout_behavior="@string/appbar_scrolling_view_behavior", sou dovrebbe funzionare subito dopo aver specificato il scrollFlags