5

У меня есть RecyclerView внутри ViewPager, который занимает только нижнюю половину экрана, и я хочу, чтобы весь экран прокручивался, если RecyclerView s получил событие вертикальной прокрутки ,Android: прокрутка проблем с recyclerview внутри viewpager

иерархии UI в двух словах:

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

Что я имею: What I have

В моем понимании, RecyclerView это память эффективным и подгоняет себя в любое пространство, которое доступно в экран. В моем приложении у меня есть ViewPager хостинг нескольких вкладок, каждый из которых имеет RecyclerView, чтобы отображать разные вещи.

Не могли бы вы дать мне некоторые идеи о том, что я могу сделать, чтобы сделать весь экран? Я предполагаю, что лучший снимок - добавить CollapsingToolbarLayout с параллаксом в статический контент в середине экрана. Я даже пытался это сделать, но пользовательский интерфейс был полностью сломан. Это сложно, так как я хочу, чтобы контент в середине экрана прокручивался, а не панели инструментов сверху. У меня не было много удачи с NestedScrollView либо, по-видимому, его совместимость с ViewPager и CoordinatorLayout не прямо вперед ..

Что я хочу: What I want

Основная деятельность План:

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

фрагмент внутри 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> 

Заранее благодарим!

Обновление: Ответы, которые я получил здесь (за что я благодарен), пришли слишком поздно. Если кто-нибудь знает, какой правильный ответ, пожалуйста, дайте мне знать!

ответ

1

Я сделал что-то очень похожее на CollapsingToolbarLayout.

Уловка здесь состоит в том, чтобы иметь две панели инструментов, один вверху с поиском, а другой - панель инструментов, предназначенную для свертывания макета.

В вашей панели поиска есть app:collapseMode="pin".

На вашей панели кнопок будет app:collapseMode="pin".

Ваш LinearLayout под панелью кнопок будет иметь режим сбрасывания по умолчанию, чтобы он прокручивался. Вы можете даже дать ему эффект параллакса с app:collapseMode="parallax".

Ваш TabLayout будет иметь app:collapseMode="pin", чтобы он прокручивался под панелью кнопок и штырьками там.

Ваш ViewPager должен находиться за пределами CollapsingToolbarLayout и иметь атрибут app:layout_behavior="@string/appbar_scrolling_view_behavior".

CollapsingToolbarLayout захочет отобразить заголовок. Просто позвоните setTitle(null) на сворачивающуюся панель инструментов и установите свой реальный заголовок на панели инструментов поиска.

Вы можете разместить свою навигацию и меню на панели инструментов поиска и на рулонной панели инструментов, и они должны работать должным образом.

Я отправлю XML позже; Я просто хотел, чтобы этот ответ начался.

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

}

Просто измените recyclerview этим.

1

Похоже, вы просто пропустите атрибут app:layout_scrollFlags. Вы должны добавить его как к Toolbar, так и к линейным макетам заголовков. Например, вы можете использовать: app:layout_scrollFlags="scroll|enterAlways"

Как я вижу, ваш ViewPager уже app:layout_behavior="@string/appbar_scrolling_view_behavior", СОУ он должен работать сразу после задания scrollFlags

Смежные вопросы