ViewPager в NestedScrollView

Мне нужно создать такой интерфейс, как Google Newsstand, который является своего рода ViewPager (горизонтальная прокрутка) над сворачивающимся заголовком (вертикальная прокрутка). Одним из моих требований является использование новой библиотеки поддержки дизайна, представленной в Google IO 2015. (http://android-developers.blogspot.ca/2015/05/android-design-support-library.html)

Основываясь на примере, созданном Крисом Банесом (https://github.com/chrisbanes/cheesesquare), я дошел до того, что могу выполнить рушительное поведение, но с базовым LinearLayout (без горизонтальной прокрутки).

Я попытался заменить LinearLayout на ViewPager, и я получил пустой экран. Я играл с: шириной, весом и всеми видами групп представлений, но... все еще пустой экран. Кажется, что ViewPager и NestedScrollView не любят друг друга.

Я попробовал обходной путь с помощью HorizontalScrollView: он работает, но я теряю преимущество функции PagerTitleStrip и фокусируюсь на одной панели (я могу остановить горизонтально между 2 панелями).

Теперь у меня больше нет идей, если кто-нибудь может привести меня к решению...

Спасибо

Вот мой последний файл макета:

<?xml version="1.0" encoding="utf-8"?>
<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="@dimen/header_height"
        android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">

        <android.support.design.widget.CollapsingToolbarLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            app:contentScrim="?attr/colorPrimary"
            app:expandedTitleMarginEnd="64dp"
            app:expandedTitleMarginStart="48dp"
            app:layout_scrollFlags="scroll|exitUntilCollapsed">

            <include
                layout="@layout/part_header"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                app:layout_collapseMode="parallax"/>

            <android.support.v7.widget.Toolbar
                android:id="@+id/activity_main_toolbar"
                android:layout_width="match_parent"
                android:layout_height="?attr/actionBarSize"
                app:layout_collapseMode="pin"
                app:popupTheme="@style/ThemeOverlay.AppCompat.Light"/>

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

    <android.support.v4.widget.NestedScrollView
        android:id="@+id/activity_main_nestedscrollview"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:fillViewport="true"
        app:layout_behavior="@string/appbar_scrolling_view_behavior">

        <android.support.v4.view.ViewPager
            android:id="@+id/activity_main_viewpager"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:background="#FFA0"/>


    </android.support.v4.widget.NestedScrollView>
</android.support.design.widget.CoordinatorLayout>

Ответ 1

Я встречаю эту проблему, я решаю ее setFillViewport (true)

<android.support.v4.widget.NestedScrollView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:id="@+id/nest_scrollview"
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior"
tools:context="mio.kon.yyb.nestedscrollviewbug.ScrollingActivity"
tools:showIn="@layout/activity_scrolling">


    <android.support.v4.view.ViewPager
        android:id="@+id/viewpager"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

в действии

  NestedScrollView scrollView = (NestedScrollView) findViewById (R.id.nest_scrollview);
    scrollView.setFillViewport (true);

введите описание изображения здесь

Ответ 2

Хорошо, я сделал небольшую демонстрацию с ViewPager и NestedScrollView. Проблема, с которой я столкнулся, заключалась в высоте ViewPager и ListView. Поэтому я сделал небольшую модификацию при измерении высоты ListView и ViewPager's.

Если кто-то захочет заглянуть в код, вот ссылка: https://github.com/TheLittleNaruto/SupportDesignExample/

Вывод:

введите описание изображения здесь

Ответ 3

Добавьте android:fillViewport="true" в NestedScrollView. период.

Ответ 4

Были те же проблемы.

При размещении NestedScrollView вокруг ViewPager это не сработает.

Что DID работает, но помещает NestedScrollView внутри макет фрагмента, который я загружаю внутри ViewPager.



<android.support.v4.widget.NestedScrollView xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        app:layout_behavior="@string/appbar_scrolling_view_behavior">
        <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
            android:id="@id/fragment_detail"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_gravity="fill_vertical"
            android:orientation="vertical">
    ...Content...
    </LinearLayout>
</android.support.v4.widget.NestedScrollView>

код >

Ответ 5

Вместо размещения ViewPager внутри NestedScrollView, сделайте это наоборот.

Поместите NestedScrollView в дочерние представления внутри ViewPager, который по сути является макетом фрагмента. Также очень вероятно, что вам даже не понадобится использовать NestedScrollView, если макет списка фрагментов очень прост.

Примеры макетов

Макет действий:

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true">

    <android.support.design.widget.AppBarLayout
        android:id="@+id/app_bar"
        android:layout_width="match_parent"
        android:layout_height="@dimen/app_bar_height"
        android:fitsSystemWindows="true"
        android:theme="@style/AppTheme.AppBarOverlay">

        <android.support.design.widget.CollapsingToolbarLayout
            android:id="@+id/toolbar_layout"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:fitsSystemWindows="true"
            app:contentScrim="?attr/colorPrimary"
            app:layout_scrollFlags="scroll|exitUntilCollapsed|snap">

            <ImageView
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:minHeight="@dimen/app_bar_height"
                android:scaleType="centerCrop"
                android:src="@drawable/my_bg"
                app:layout_collapseMode="parallax"
                app:layout_collapseParallaxMultiplier="0.8"
                app:layout_scrollFlags="scroll|enterAlways|enterAlwaysCollapsed" />

            <android.support.v7.widget.Toolbar
                android:id="@+id/toolbar"
                android:layout_width="match_parent"
                android:layout_height="?attr/actionBarSize"
                app:layout_collapseMode="pin"
                app:popupTheme="@style/AppTheme.PopupOverlay" />

        </android.support.design.widget.CollapsingToolbarLayout>

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

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        app:layout_behavior="@string/appbar_scrolling_view_behavior">

        <android.support.design.widget.TabLayout
            android:id="@+id/content_tabs"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />

        <android.support.v4.view.ViewPager
            android:id="@+id/viewPager"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="1" />
    </LinearLayout>

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

Если вам не нужен TabLayout, вы можете вырезать LinearLayout и сделать ViewPager автономным. Но обязательно используйте app:layout_behavior="@string/appbar_scrolling_view_behavior" в атрибутах ViewPager.

Макет простого фрагмента:

<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.RecyclerView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/recycler_view"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

Макет сложного фрагмента:

<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.NestedScrollView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:fillViewport="true"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
        <android.support.v7.widget.RecyclerView
            android:id="@+id/recycler_view"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />
        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Hello World"/>
    </RelativeLayout>
</android.support.v4.widget.NestedScrollView>

Пример приложения: CollapsingToolbarPoc

введите описание изображения здесь

Ответ 6

вы можете попробовать это, viewpager отлично работает, но высота viewpager исправлена.

Я все еще нахожу лучшее решение..., поэтому, пожалуйста, дайте мне знать, что любой момент может сделать это лучше, спасибо

<android.support.v4.widget.NestedScrollView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:layout_behavior="@string/appbar_scrolling_view_behavior">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:minHeight="800dp"
        android:orientation="vertical">

        <android.support.v4.view.ViewPager
            android:id="@+id/pager"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="1"/>
    </LinearLayout>
</android.support.v4.widget.NestedScrollView>

Ответ 7

У меня была такая же проблема, и я просто исправил ее с некоторыми изменениями. ViewPager не работает в пределах NestedScrollView. Просто поставьте ViewPager в качестве прямого дочернего элемента вашего CoordinatorLayout. Затем контент для каждого фрагмента ViewPager должен быть заключен в NestedScrollView.. Это он.

Ответ 8

Вам не нужно использовать NestedScrollView для получения эффектов параллакса. попробуйте что-то вроде этого:

<android.support.design.widget.CoordinatorLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <android.support.design.widget.AppBarLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:animateLayoutChanges="true">

        <android.support.v7.widget.Toolbar
            android:id="@+id/my_toolbar"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            app:layout_scrollFlags="scroll|enterAlways"/>

        <android.support.design.widget.TabLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:id="@+id/my_tab_layout"
            android:fillViewport="false"
            app:tabMode="fixed"/>
     </android.support.design.widget.AppBarLayout>

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

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

Ответ 9

Я удалил NestedScrollView из основного макета и вставил в качестве родителя во все мои макеты Фрагмент, которые должны были загружаться в ViewPager, исправлено это вопрос для меня.

Ответ 10

Для решения вашей проблемы используйте подгоняемый класс. Не забудьте вызвать метод onRefresh() на странице changelistener.

public class ContentWrappingViewPager extends ViewPager
{
    private int width = 0;
    public ContentWrappingViewPager(Context context) {
        super(context);
    }

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

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)
    {
        int height = 0;
        width = widthMeasureSpec;
        if (getChildCount() > getCurrentItem()) {
            View child = getChildAt(getCurrentItem());
            child.measure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
            int h = child.getMeasuredHeight();
            if(h > height) height = h;
        }

        heightMeasureSpec = MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY);

        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    }

    public void onRefresh()
    {
        try {
            int height = 0;
            if (getChildCount() > getCurrentItem()) {
                View child = getChildAt(getCurrentItem());
                child.measure(width, MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
                int h = child.getMeasuredHeight();
                if(h > height) height = h;
            }

            int heightMeasureSpec = MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY);
            ViewGroup.LayoutParams layoutParams = this.getLayoutParams();
            layoutParams.height = heightMeasureSpec;
            this.setLayoutParams(layoutParams);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

Ответ 11

Следующее должно обеспечить правильную высоту пейджера представления. Фрагмент - это первый фрагмент, предоставленный пейджером представления.

<android.support.v4.widget.NestedScrollView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:layout_behavior="@string/appbar_scrolling_view_behavior">

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

        <android.support.v4.view.ViewPager
            android:id="@+id/viewPager"
            android:layout_width="match_parent"
            android:layout_height="match_parent"/>

        <fragment
            class="com.mydomain.MyViewPagerFragment"
            android:id="@+id/myFragment"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:visibility="gone"/>

    </LinearLayout>

</android.support.v4.widget.NestedScrollView>

Ответ 12

У меня была аналогичная проблема (но без CollapsingToolbarLayout, просто Toolbar + TabLayout в AppBarLayout). Я хотел, чтобы панель инструментов прокручивалась из поля зрения при прокрутке содержимого ViewPager в пределах NestedScrollView.

В моем макете было что-то вроде этого:

<android.support.design.widget.CoordinatorLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".MainActivity">

        <android.support.design.widget.AppBarLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:animateLayoutChanges="true">

            <android.support.v7.widget.Toolbar
                android:id="@+id/my_toolbar"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                app:layout_scrollFlags="scroll|enterAlways"/>

            <android.support.design.widget.TabLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:id="@+id/my_tab_layout"
                android:fillViewport="false"
                app:tabMode="fixed"/>
         </android.support.design.widget.AppBarLayout>

         <android.support.v4.widget.NestedScrollView
                android:id="@+id/container"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:fillViewport="true"
                android:layout_gravity="fill_vertical"
                app:layout_behavior="@string/appbar_scrolling_view_behavior">

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

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

Этот макет не работал должным образом, но я решил его просто избавиться от NestedScrollView и вместо этого использовать LinearLayout. Он сразу работал у меня в Android Support Library v23.1.0. Вот как закончилось оформление:

<android.support.design.widget.CoordinatorLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".MainActivity">

        <android.support.design.widget.AppBarLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:animateLayoutChanges="true">

            <android.support.v7.widget.Toolbar
                android:id="@+id/my_toolbar"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                app:layout_scrollFlags="scroll|enterAlways"/>

            <android.support.design.widget.TabLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:id="@+id/my_tab_layout"
                android:fillViewport="false"
                app:tabMode="fixed"/>
         </android.support.design.widget.AppBarLayout>

         <LinearLayout
            android:orientation="vertical"
            android:id="@+id/container"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_marginBottom="4dp"
            app:layout_behavior="@string/appbar_scrolling_view_behavior">

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

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

PS: На самом деле это были два файла макета в моем проекте. Я скопировал и вставил их здесь и попытался структурировать их, как это было бы в одном файле. Прошу прощения, если я напортачил при копировании, но, пожалуйста, дайте мне знать, если это так, я могу это исправить.

Ответ 13

У меня был макет с панелью инструментов приложения с NestedScrollView под ним, затем внутри вложенной панели инструментов был LinearLayout, ниже LinearLayout был пейджер представления. Идея заключалась в том, что LinearLayout внутри NestedScrollView был исправлен - вы могли скользить влево/вправо между представлениями пейджера представления, но этот контент не перемещался, по крайней мере, по горизонтали. Вы все равно можете прокручивать все содержимое по вертикали из-за вложенного представления прокрутки. Это была идея. Поэтому я установил вложенную высоту NestedScrollView в match_parent, запустил viewport, затем все дочерние макеты /ViewPager для wrap_content.

В моей голове это было правильно. Но это не сработало - ViewPager разрешил мне идти влево/вправо, но нет вертикальной прокрутки, будь то содержание страницы в представлении, подтолкнутое ниже нижней части текущего экрана или нет. Оказывается, это было в основном потому, что ViewPager не рассматривает wrap_content на разных страницах.

Я обошел это, подклассифицировав ViewPager, чтобы он менял высоту в зависимости от текущего выбранного элемента, и это заставляло его вести себя как layout_height = "wrap_content":

public class ContentWrappingViewPager extends ViewPager {

    public ContentWrappingViewPager(Context context) {
        super(context);
    }

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

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

        int height = 0;
        if (getChildCount() > getCurrentItem()) {
            View child = getChildAt(getCurrentItem());
            child.measure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
            int h = child.getMeasuredHeight();
            if(h > height) height = h;
        }

        heightMeasureSpec = MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY);

        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    }
}

Решение было вдохновлено этим ответом. Работал для меня!

Ответ 14

У меня такое же желание, гнездо a ViewPager внутри a NestedScrollView. Но для меня это тоже не работает. В моем случае ViewPager находится внутри Fragment, поэтому я могу переключать контент в зависимости от взаимодействия с ящиком. Конечно, AppBar, коллапс и т.д. И все новые функции библиотеки поддержки должны работать.

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

Что я делал, что работает, так это то, что я больше не вставляю ViewPager внутри a NestedScrollView, вместо этого вставляю содержимое содержащихся фрагментов внутри NestedScrollView.

Затем, в случае прокрутки в одном фрагменте, я информирую контейнер о новой позиции прокрутки, которая хранит его.

Наконец, при прокрутке влево или вправо, обнаруженном на пейджере (используя addOnPageChangeListener для поиска состояний перетаскивания), я информирую целевой левый или правый фрагмент, где он должен прокручивать (на основе знания контейнера), который должен быть выровнен из фрагмент, из которого я пришел.

Ответ 15

Я знаю одно рабочее решение: вы используете Activity, с CoordinatorLayout и используете FrameLayout, контейнер. Затем. используйте менеджер фрагментов для размещения фрагмента в контейнере. Например, мой код:

<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:orientation="vertical">

<android.support.design.widget.AppBarLayout
    android:id="@+id/appbar"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    app:elevation="0dp">

    <android.support.v7.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        app:layout_scrollFlags="scroll|enterAlways"
        android:layout_height="@dimen/toolbar_height"
        android:background="?attr/colorPrimary"
        android:gravity="center">

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


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

<FrameLayout
    android:id="@+id/container"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    app:layout_behavior="@string/appbar_scrolling_view_behavior">

</FrameLayout>

И фрагмент:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.improvemdia.inmyroom.MainFragment">

<android.support.v4.view.ViewPager
    android:id="@+id/pager"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

Затем используйте FragmentManager

getSupportFragmentManager().beginTransaction()
            .replace(R.id.container, new MainFragment())
            .commit();

Ответ 16

Проведя часы, пробовал все вышеперечисленные предложения, наконец, я заработал. Ключ заключается в помещении NestedScrollView внутри PageViewer, и установите layout_behavior в '@string/appbar_scrolling_view_behavior' для BOTH. Окончательный макет похож на

<CoordinatorLayout>
    <ViewPager app:layout_behavior="@string/appbar_scrolling_view_behavior">
        <NestedScrollView fillViewport="true" app:layout_behavior="@string/appbar_scrolling_view_behavior">
            <Content>...</Content>
        </NestedScrollView>
    </ViewPager>
    <AppBarLayout>...</AppBarLayout>
</CoordinatorLayout>

Ответ 17

вы просто удалили NestedScrollView на свой xml и добавили этот код в свой класс

yourGridView.setNestedScrollingEnabled(true);

Ответ 18

На самом деле, NestedScrollView не должен быть прямым родственником CollapsingToolbarLayout в CoordinatorLayout. Я достиг чего-то реального bizzare. Приложение appbar_scrolling_view_behavior работает с двумя вложенными фрагментами.

Мой макет деятельности:

<android.support.design.widget.CoordinatorLayout>

    <android.support.design.widget.AppBarLayout>

            <android.support.design.widget.CollapsingToolbarLayout>

                <include
                    layout="@layout/toolbar"/>

            </android.support.design.widget.CollapsingToolbarLayout>

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

    <FrameLayout
        android:id="@+id/container"
        app:layout_behavior="@string/appbar_scrolling_view_behavior"/>

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

В "контейнере" frameLayout я раздул этот фрагмент:

<android.support.constraint.ConstraintLayout>

    ... some content ...

    <android.support.v4.view.ViewPager/>

    ...

</android.support.constraint.ConstraintLayout>

И фрагменты внутри этого ViewPager выглядят следующим образом:

<RelativeLayout>

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

    ....

</RelativeLayout>

Факт, что NestedScrollView может быть настолько глубоким в иерархии дочерних элементов CoordinatorLayout и поведения поведения прокрутки, что работы действительно меня удивили.

Ответ 19

просто поместите эту строку в NestedScrollView

android:fillViewport="true"