ViewPager 内的多个 NestedScrollView 不滚动

Tho*_*ord 4 android android-layout

我有一个 ViewPager,它在每个页面上显示不同的片段。所有片段都有一个 NestedScrollView 作为其根视图。所以本质上是这样的:

第一个_fragment_layout.xml:

<android.support.v4.widget.NestedScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <android.support.v7.widget.RecyclerView
        android:id="@+id/recycler_view"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:padding="4dp"/>

</android.support.v4.widget.NestedScrollView>
Run Code Online (Sandbox Code Playgroud)

Second_fragment_layout.xml:

<android.support.v4.widget.NestedScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

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

        <!-- Various irrelevant views -->

    </LinearLayout>

</android.support.v4.widget.NestedScrollView>
Run Code Online (Sandbox Code Playgroud)

...ETC。

这些片段是通过我的 FragmentPagerAdapter 类实例化的,如下所示:

private class ViewPagerAdapter extends FragmentPagerAdapter
{
    private final List<String> mFragmentNameList = new ArrayList<>();

    public ViewPagerAdapter(FragmentManager fm)
    {
        super(fm);
    }

    @Override
    public Fragment getItem(int position)
    {
        return Fragment.instantiate(getContext(), mFragmentNameList.get(position));
    }

    @Override
    public int getCount()
    {
        return mFragmentNameList.size();
    }

    void add(String fragmentName)
    {
        mFragmentNameList.add(fragmentName);
    }
}
Run Code Online (Sandbox Code Playgroud)

我的问题是 NestedScrollView 一次只能滚动其中一个片段(通常不能滚动当前页面上的片段)。似乎存在一个问题,即任何时候只有一个 NestedScrollView 可以处于活动状态(第一个膨胀的那个)。我推断这是因为能够滚动的片段总是直接位于无法滚动的片段旁边,并且默认情况下,ViewPager 的内存中最多保留两个片段(即ViewPager.setOffscreenPageLimit(int limit)默认为 1)

Tho*_*ord 5

休息了20分钟,立刻就解决了。ViewPager 需要启用嵌套滚动,可以通过 xmlandroid:nestedScrollingEnabled="true"或以编程方式通过ViewCompat.setNestedScrollingEnabled(viewPager, true)(仅 >= API 21)