RecyclerView with table like layout and Sticky header -- 最初尝试过 NestedScrollView 但没有成功

RecyclerView with table like layout and Sticky header -- Originally tried NestedScrollView with no success

我正在为学生制定每日时间表。这个时间表是一个片段。我需要一个带有 7 天标签的粘性 header,然后项目需要在下方滚动,一次全部完成。另外我需要整个视图水平滚动。

目前我有一个 Horizo​​ntalScrollView、一些嵌套的 LinearLayouts 和一个 NestedScrollView。 NestedScrollView 有 7 个 children 的 RecyclerView,一个对应一周中的每一天。这样我就可以在每个 RecyclerView 上调用 setNestedScrollingEnabled(false),以便它们一起滚动。目前的结果是 NestedScrollView 将 RecyclerViews 剪辑为 1 个项目,并且无法滚动。如果我删除 NestedScrollView,RecyclerViews 将全部单独滚动,这不是我想要的。

activity_main.xml

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:gravity="center"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <android.support.v7.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            android:background="?attr/colorPrimary"
            android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
            app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
            android:elevation="4dp" />

        <FrameLayout
            android:layout_below="@id/toolbar"
            android:id="@+id/frame_container"
            android:layout_width="match_parent"
            android:layout_height="match_parent"/>

    </RelativeLayout>

fragment_schedule.xml

<?xml version="1.0" encoding="utf-8"?>
<HorizontalScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:paddingLeft="16dp"
    android:paddingRight="16dp"
    android:paddingTop="8dp"
    android:paddingBottom="8dp">

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

            <ProgressBar
                android:id="@+id/loading"
                android:layout_width="74dp"
                android:layout_height="74dp"
                android:visibility="gone"
                android:layout_gravity="center"/>

            <LinearLayout
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                >

                ...7 ImageViews representing days of week...

            </LinearLayout>

            <android.support.v4.widget.NestedScrollView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:fillViewport="true">

                <LinearLayout
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:fillViewport="true"
                    android:layout_marginTop="8dp">
                    <android.support.v7.widget.RecyclerView
                        android:id="@+id/sunday_list"
                        android:layout_width="84dp"
                        android:layout_height="wrap_content"
                        tools:background="@color/accent_gold"/>

                    <android.support.v7.widget.RecyclerView
                        android:id="@+id/monday_list"
                        android:layout_width="84dp"
                        android:layout_height="wrap_content"
                        android:layout_marginLeft="8dp"
                        tools:background="@color/accent_gold"/>

                    <android.support.v7.widget.RecyclerView
                        android:id="@+id/tuesday_list"
                        android:layout_width="84dp"
                        android:layout_marginLeft="8dp"
                        android:layout_height="wrap_content"
                        tools:background="@color/accent_gold"/>

                    <android.support.v7.widget.RecyclerView
                        android:id="@+id/wednesday_list"
                        android:layout_width="84dp"
                        android:layout_height="wrap_content"
                        android:layout_marginLeft="8dp"
                        tools:background="@color/accent_gold"/>

                    <android.support.v7.widget.RecyclerView
                        android:id="@+id/thursday_list"
                        android:layout_width="84dp"
                        android:layout_height="wrap_content"
                        android:layout_marginLeft="8dp"
                        tools:background="@color/accent_gold"/>

                    <android.support.v7.widget.RecyclerView
                        android:id="@+id/friday_list"
                        android:layout_width="84dp"
                        android:layout_height="wrap_content"
                        android:layout_marginLeft="8dp"
                        tools:background="@color/accent_gold"/>

                    <android.support.v7.widget.RecyclerView
                        android:id="@+id/saturday_list"
                        android:layout_width="84dp"
                        android:layout_height="wrap_content"
                        android:layout_marginLeft="8dp"
                        tools:background="@color/accent_gold"/>
                </LinearLayout>

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

        </LinearLayout>
</HorizontalScrollView>

片段 class 中唯一值得注意的是我在填充并附加所有适配器后调用 setNestedScrolledEnabled(false)

非常感谢任何见解!

这种情况的解决方法是我对需求的考虑太死板了。我将布局更改为由 header 线性布局、滚动视图和水平回收器视图组成,每一天都是一个项目。在适配器中,项目布局只是一个 LinearLayout,我以编程方式将 class 视图添加到(因为每天有有限数量的 classes)。滚动在两个方向上都有效。我将重新命名这个问题,希望有人能找到它来满足类似的要求。

片段xml

<?xml version="1.0" encoding="utf-8"?>
<HorizontalScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:paddingLeft="16dp"
    android:paddingRight="16dp"
    android:paddingTop="8dp"
    android:paddingBottom="8dp">

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

        <ProgressBar
            android:id="@+id/loading"
            android:layout_width="74dp"
            android:layout_height="74dp"
            android:visibility="gone"
            android:layout_gravity="center"/>

        <LinearLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            >
            ...Image Views Representing Days of Week...
        </LinearLayout>

        <ScrollView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content">
            <android.support.v7.widget.RecyclerView
                android:id="@+id/day_list"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                />

        </ScrollView>

    </LinearLayout>
</HorizontalScrollView>

RecyclerViewItem.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="84dp"
    android:layout_height="match_parent"
    android:id="@+id/item_schedule_layout"
    android:layout_marginRight="8dp"
    android:layout_marginTop="8dp"
    android:layout_marginBottom="8dp"
    android:layout_marginLeft="0dp">


</LinearLayout>

然后以编程方式将视图添加到 LinearLayout。我对每个 class 的视图都很复杂,因此我根据每个 class 所需的布局创建了一个自定义视图,然后能够在 for 循环中定义一个新实例并将其添加到 LinearLayout .