Android: прокрутка проблем с recyclerview внутри viewpager

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

Иерархия пользовательского интерфейса в двух словах:

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

Что у меня есть : Что у меня есть

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

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

Что я хочу: Что я хочу

Основной вид деятельности:

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

Заранее спасибо!

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

 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 этим.

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

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

На панели инструментов searchview будет установлено app:collapseMode="pin" .

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

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

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

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

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

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

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

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

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