具有水平滚动的嵌套 RecyclerView 中的滚动行为

Posted

技术标签:

【中文标题】具有水平滚动的嵌套 RecyclerView 中的滚动行为【英文标题】:Scroll behavior in nested RecyclerView with horizontal scroll 【发布时间】:2015-12-08 02:58:29 【问题描述】:

我必须在每个项目中创建垂直的RecyclerView 和嵌套的水平RecyclerView。一切都在CoordinatorLayout 之内。当我通过点击嵌套的 RecyclerView 工具栏隐藏外部进行滚动时,但是当我通过点击嵌套的一个工具栏来滚动父 Recycler 时。

任何帮助将不胜感激。

这是我的 xml 布局:

main_activity.xml:

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

<FrameLayout
    android:id="@+id/fragment_frame"
    ...
    android:fitsSystemWindows="true"
    app:layout_behavior="@string/appbar_scrolling_view_behavior"/>

<android.support.design.widget.AppBarLayout
    ...
    android:fitsSystemWindows="true"
    android:id="@+id/appbar_layout">

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

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

这里是toolbar.xml:

<android.support.v7.widget.Toolbar
    android:id="@+id/main_toolbar"
    ...
    android:fitsSystemWindows="true"
    app:layout_scrollFlags="scroll|enterAlways">

    <TextView .../>

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

片段.xml:

<android.support.v7.widget.RecyclerView
    ...
    android:scrollbars="vertical"
    app:layout_behavior="@string/appbar_scrolling_view_behavior"/>

还有recycler_view_item.xml:

<RelativeLayout ...>

    <TextView .../>

    <!-- fixme(CullyCross) fix bug with hiding toolbar -->
    <android.support.v7.widget.RecyclerView
        ...
        android:scrollbars="horizontal"
        app:layout_behavior="@string/appbar_scrolling_view_behavior"
        />

</RelativeLayout>

谢谢, 安东

【问题讨论】:

运气好吗?我也面临同样的问题! @RafiqueMohammed 不,对不起 @AntonShkurenko 你得到解决方案了吗..我面临同样的问题.. @RHL 不,我没有,我离开了那份工作 :) 试试下面的解决方案,这似乎是真的(我没有检查),如果它是真的,就给它投票 【参考方案1】:

按照这里的要求,我找到了迄今为​​止足够好的解决方案:

在我的例子中,我有一个 nestedScrollView,其中 4 个 RecyclerViews 设置为在里面水平滚动。对于每个RecyclerViews,我都以编程方式完成了此操作:

restaurantsRecylerView.setHasFixedSize(true); 
restaurantsRecylerView.setNestedScrollingEnabled(false);

您可能不想要 fixedSize,不确定它是否会有所不同,我的列表总是 25,所以我可以使用它来提高性能。完成此操作后,即使触摸 recyclerViews,我也可以毫无问题地滚动

希望对你有帮助

【讨论】:

setNestedScrollingEnabled 对我有帮助。并不是说您也可以使用 android:nestedScrollingEnabled="false" 在 xml 中设置它:) 我只禁用了嵌套滚动,它也有效。谢谢。 XML android:nestedScrollingEnabled="false" 用于使用 Groupie 的嵌套回收器工作。 @All 我必须在水平回收器视图中为每个项目创建垂直回收器视图。主要部分,如果用户滚动任何内部水平回收器视图,我需要滚动每个项目中的所有回收器视图。我已经尝试完成了 80 %,但是遇到了问题......我现在需要的是我们可以停止在 RecyclerView.SCROLL_STATE_SETTLING 状态下滚动【参考方案2】:

尝试在android.support.v4.widget.NestedScrollView 中使用RecyclerView

<android.support.v4.widget.NestedScrollView
        android:id="@+id/nScrollView"
        android:layout_
        android:layout_>

<!-- Set other views of your Layout -->

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

还可以尝试在Toolbar

中使用不同的layout_scrollFlags
RecylerView.setNestedScrollingEnabled(false); // set it true or false as per requirement

【讨论】:

我遇到了完全相同的问题。我在 NestedScrollView 中有一个水平 recyclerViews 列表。如果您滚动点击其中一个 recyclerViews,则协调器布局无法正常工作。如果您点击其他任何地方都可以,工具栏不会隐藏或显示。尝试水平滚动时也有非常糟糕的体验。 @Lancelot 我当时没找到答案,如果你找到了,在这里写下答案,我会接受的 嗨@AntonShkurenko 这是我所做的,到目前为止我对解决方案感到满意。在我的情况下,我有一个带有 4 个 RecyclerViews 的 nestedScrollView 设置为在内部水平滚动。对于每个 RecyclerViews,我都以编程方式完成了此操作:restaurantRecylerView.setHasFixedSize(true); restaurantRecylerView.setNestedScrollingEnabled(false);您可能不想要fixedSize,不确定它是否会有所不同,我的列表总是25,所以我可以使用它来提高性能。完成此操作后,即使触摸 recyclerViews,我也可以毫无问题地滚动 @Lancelot 我一直在努力解决这个问题,而您的解决方案正是我想要的。我很难找到这个答案,如果你把它作为答案而不是评论,其他人可能会更容易找到,你会得到一些代表。至少来自我。谢谢。 嗨@DanielJulio 我刚刚发布了答案,我仍在努力让它变得更好,因为水平滚动有时有点困难。感谢您的评论。【参考方案3】:

我们可以在 XML 中实现这一点

android:nestedScrollingEnabled="false"

【讨论】:

以上是关于具有水平滚动的嵌套 RecyclerView 中的滚动行为的主要内容,如果未能解决你的问题,请参考以下文章

创建具有水平和垂直滚动的 RecyclerView

具有垂直和水平滚动的 Recyclerview

Android 布局:具有滚动行为的 Viewpager 内的垂直 Recyclerview 内的水平 Recyclerview

当nestedscrollview 中的recyclerview 滚动时,对讲焦点转到工具栏项

具有水平滚动的嵌套 UIScrollViews

如何修复垂直 RecyclerView 内的水平 ViewPager2 和 RecyclerView 的滚动问题?