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,然后项目需要在下方滚动,一次全部完成。另外我需要整个视图水平滚动。
目前我有一个 HorizontalScrollView、一些嵌套的 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 .
我正在为学生制定每日时间表。这个时间表是一个片段。我需要一个带有 7 天标签的粘性 header,然后项目需要在下方滚动,一次全部完成。另外我需要整个视图水平滚动。
目前我有一个 HorizontalScrollView、一些嵌套的 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 .