5

Mam RecyclerView wewnątrz ViewPager, który zajmuje tylko dolną połowę ekranu, a co chcę zrobić, to przewiń cały ekran, jeśli RecyclerView s odebrał pionowe przewijanie .Android: Problemy z przewijaniem z widokiem z recyklingu wewnątrz podglądu

UI hierarchia w pigułce:

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

Co mam: What I have

W moim rozumieniu, RecyclerView jest pamięć efektywny i próbuje zmieścić się w każdej przestrzeni jest dostępny w ekran. W mojej aplikacji mam ViewPager hostingu wiele kart, z których każda ma RecyclerView, aby wyświetlić różne rzeczy.

Czy możesz podać mi kilka pomysłów na temat tego, co mogę zrobić, aby przewinąć cały ekran? Zgaduję, że najlepszym ujęciem jest dodanie CollapsingToolbarLayout z paralaksą do statycznej zawartości na środku ekranu. Próbowałem nawet to zrobić, ale interfejs był kompletnie zepsuty. Jest to trudne, ponieważ chcę, aby zawartość na środku ekranu była przewijana, a nie paski narzędzi na górze. Nie miałem dużo szczęścia z NestedScrollView albo, widocznie jego kompatybilność z ViewPager i CoordinatorLayout nie jest prosta ..

Czego chcę: What I want

Główny Układ aktywny:

<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> 

fragment wewnątrz 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> 

Z góry dziękuję!

Aktualizacja: Odpowiedzi, które otrzymałem tutaj (za co jestem wdzięczny) przyszły trochę za późno. Jeśli ktokolwiek wie, która jest poprawna odpowiedź, daj mi znać!

Odpowiedz

1

Zrobiłem coś bardzo podobnego do tego z CollapsingToolbarLayout.

Sztuką jest tutaj posiadanie dwóch pasków narzędzi: z podglądem wyszukiwania oraz paska narzędzi poświęconego układowi zwijania.

Pasek narzędzi wyszukiwania będzie miał app:collapseMode="pin".

Twój pasek przycisków będzie miał app:collapseMode="pin".

Twój LinearLayout poniżej paska przycisków będzie miał domyślny tryb zwijania, dzięki czemu będzie przewijany. Możesz nawet nadać mu efekt paralaksy z app:collapseMode="parallax".

Twoje TabLayout będzie mieć app:collapseMode="pin", więc przewija się pod paskiem przycisków i tam szpilki.

Twoja ViewPager powinna znajdować się poza CollapsingToolbarLayout i mieć atrybut app:layout_behavior="@string/appbar_scrolling_view_behavior".

Użytkownik chce wyświetlać tytuł w postaci CollapsingToolbarLayout. Wystarczy zadzwonić pod numer setTitle(null) na zwijanym pasku narzędzi i ustawić swój prawdziwy tytuł na pasku narzędzi wyszukiwania.

Możesz umieścić swoją nawigację i menu na pasku narzędzi wyszukiwania i na zwijanym pasku narzędzi i powinny działać zgodnie z oczekiwaniami.

Będę pisać trochę XML później; Chciałem tylko zacząć tę odpowiedź.

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

}

Wystarczy zmienić recyclerview przez to.

1

Wygląda na to, że po prostu brakuje Ci atrybutu app:layout_scrollFlags. Powinieneś dodać go do Toolbar i liniowych układów nagłówków. Na przykład, można użyć: app:layout_scrollFlags="scroll|enterAlways"

Jak widzę, twój ViewPager ma już app:layout_behavior="@string/appbar_scrolling_view_behavior", sou powinno działać tuż po określeniu scrollFlags

Powiązane problemy