Scolling with multiple RecyclerViews in Layout

2019-02-02 17:21发布

问题:

I have created a layout which has two RecyclerViews. One scrolls horizontally while other scrolls vertically. I can scroll correctly inside each RecyclerView but the page as a whole won't scroll i.e. top RecyclerView stays at top always and bottom one stays at bottom like both are fixed in position.

Following is my xml layout:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical">

        <EditText
            android:id="@+id/search"
            android:layout_width="fill_parent"
            android:layout_height="50dp"
            android:hint="Search Dramas"
            android:textSize="16sp"
            android:paddingLeft="10dp"
            android:gravity="center"
            android:textColor="@color/dark_grey"
            android:textColorHint="@color/dark_grey"
            android:background="@drawable/border_bottom"/>


        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="@drawable/border_bottom_background_black"
            android:textColor="@color/white"
            android:padding="10dp"
            android:text="Most Watched"/>

        <!-- A RecyclerView to display horizontal list -->
        <android.support.v7.widget.RecyclerView
            android:id="@+id/featured"
            android:scrollbars="none"
            android:layout_width="fill_parent"
            android:layout_height="240dp"
            android:paddingLeft="0dp"
            android:paddingRight="15dp"
            android:paddingTop="15dp"
            android:paddingBottom="25dp"
            android:background="@color/black"/>

        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="@drawable/border_bottom_backgroundless"
            android:textColor="@color/dark_grey"
            android:padding="10dp"
            android:text="All Dramas"/>

        <!-- A RecyclerView to display vertical list -->
        <android.support.v7.widget.RecyclerView
            android:id="@+id/pick_item"
            android:scrollbars="vertical"
            android:layout_width="fill_parent"
            android:layout_height="match_parent"/>


</LinearLayout>

回答1:

I was able to solve the problem by putting everything inside ScrollView and then setting height of vertical RecyclerView manually/programmatically.

<?xml version="1.0" encoding="utf-8"?>
<ScrollView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:id="@+id/scrollView">

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

            <EditText
                android:id="@+id/search"
                android:layout_width="fill_parent"
                android:layout_height="50dp"
                android:hint="Search Dramas"
                android:textSize="16sp"
                android:paddingLeft="10dp"
                android:gravity="center"
                android:textColor="@color/dark_grey"
                android:textColorHint="@color/dark_grey"
                android:background="@drawable/border_bottom"/>


            <TextView
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:background="@drawable/border_bottom_background_black"
                android:textColor="@color/white"
                android:padding="10dp"
                android:text="Most Watched"/>

            <!-- A RecyclerView to display horizontal list -->
            <android.support.v7.widget.RecyclerView
                android:id="@+id/featured"
                android:scrollbars="none"
                android:layout_width="fill_parent"
                android:layout_height="240dp"
                android:paddingLeft="0dp"
                android:paddingRight="15dp"
                android:paddingTop="15dp"
                android:paddingBottom="25dp"
                android:background="@color/black"/>

            <TextView
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:background="@drawable/border_bottom_backgroundless"
                android:textColor="@color/dark_grey"
                android:padding="10dp"
                android:text="All Dramas"/>

            <!-- A RecyclerView to display list -->
            <android.support.v7.widget.RecyclerView
                android:id="@+id/pick_item"
                android:paddingBottom="20dp"
                android:scrollbars="vertical"
                android:layout_width="fill_parent"
                android:layout_height="match_parent"
                android:minHeight="840dp"/>


    </LinearLayout>
</ScrollView>

Setting RecyclerView's height programmatically:

LinearLayout.LayoutParams params = new     
     LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, 
     ViewGroup.LayoutParams.WRAP_CONTENT);
// calculate height of RecyclerView based on child count
params.height=1150;
// set height of RecyclerView
recyclerView.setLayoutParams(params);


回答2:

RecyclerView only gained (still limited) support for nested scrolling in version 22.2.0 - my first suggestion would be to try that.

The only view that fully supports nested scrolling is NestedScrollView (you can see this by noting that it implements both NestedScrollingChild and NestedScrollingParent) and was added in Support v4 version 22.1.0 (slightly improved in 22.2.0). If you only have a single horizontal RecyclerView as the topmost item in your vertical RecyclerView, you could instead replace that with a NestedScrollView that contains a LinearLayout with your horizontal RecyclerView followed by your vertical RecyclerView.