嵌套滚动视图内的 Recyclerview 滚动,但不像普通 Recyclerview 或嵌套滚动视图那样快速滚动

Posted

技术标签:

【中文标题】嵌套滚动视图内的 Recyclerview 滚动,但不像普通 Recyclerview 或嵌套滚动视图那样快速滚动【英文标题】:Recyclerview inside Nested Scrollview scroll but does not fast scroll like normal Recyclerview or Nested Scrollview 【发布时间】:2016-09-15 01:33:20 【问题描述】:

我在NestedScrollView 中使用RecyclerView,它可以工作。但是当我在LinearLayout 内使用RecyclerView 或其他东西时,它会根据手势以不同的速度滚动。滚动听手势,如果我只向上滑动一点,那么它会滚动一点,如果我真的快速向上滑动,那么它就会滚动得非常快。现在我的问题是RecyclerView 里面NestedScrollView 肯定滚动但快速滚动不起作用。但是我快速或慢速滑动,RecyclerViewNestedScrollView 只滚动一点。

如何让我的NestedScrollViewRecyclerView 在滚动视图中以不同的速度滚动?

【问题讨论】:

recyclerView.setNestedScrollingEnabled(false);这真的有效! ***.com/questions/27083091/… 解决方案可以在这里找到。 请使用open fun setNestedScrollingEnabled(enabled: Boolean): Unit希望对您有所帮助 【参考方案1】:

试试

recyclerView.setNestedScrollingEnabled(false);

【讨论】:

但是通过这个设置,recyclerview 不会回收视图!您对此有何看法? 实际上,我在我的布局中添加了两个或多个具有不同布局管理器(例如线性布局和网格布局)的回收器视图,其中还包括横幅和其他视图。因此,要像这样处理回收站视图,请将所有这些都放在嵌套滚动视图修复中。 我不知道这个答案是如何得到这么多赞成的。如果禁用嵌套滚动,那么它就违背了它的目的。如果我想使用嵌套卷轴和回收器怎么办?像 CoordinatorLayout、AppBarLayout 和 RecyclerView 这样的东西?? 感谢@JimitPatel,这正是我目前的问题。我在嵌套滚动视图中有一个回收视图,但我无法滚动。***.com/questions/41259756/… @Karoly 需要自定义嵌套卷轴...我有...将在几个小时内发布...目前,我正在旅行。我在工具栏后的回收器视图中遇到了视差效果问题。【参考方案2】:

默认setNestedScrollingEnabled 仅在 API-21 之后有效。

您可以使用ViewCompat.setNestedScrollingEnabled(recyclerView, false); 在 API-21(Lollipop) 之前和之后禁用嵌套滚动。 Link to documentation.

【讨论】:

【参考方案3】:

我正在使用 android 16 无法使用 setNestedSCrollEnabled 方法,

我最终会做些什么来阻止 RecyclerView 处理 Scrolls。

就像在 LinerLayoutManager 中一样,我制作了 canScrollHorizo​​ntally,canScrollVertically 默认返回 false。

myRecyclerView.setLayoutManager(new LinearLayoutManager(getContext(), LinearLayoutManager.VERTICAL, false)
            @Override
            public boolean canScrollHorizontally() 
                return false;
            

            @Override
            public boolean canScrollVertically() 
                return false;
            
        );

【讨论】:

这实际上对我有用。我有一个 RecyclerView,在 LinearLinear 内,在 ScrollView 内。【参考方案4】:

经过多次迭代,我想出了一个解决方案。

    如果你使用的是 RecyclerView,那么:

    recyclerView.setNestedScrollingEnabled(false);
    

    如果您在 NestedScrollingView 中使用 LinearLayout,请在普通 ScrollView 中使用 LinearLayout,然后将其滚动设置为

    scrollView.setNestedScrollingEnabled(false);
    

【讨论】:

【参考方案5】:

android:overScrollMode="never

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


    <LinearLayout
        android:layout_
        android:layout_
        android:orientation="vertical">

        <android.support.v7.widget.RecyclerView
            android:id="@+id/recyclerView"
            android:layout_
            android:layout_ />

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

【讨论】:

【参考方案6】:

您可以将 ScrollView 与重写 onMeasure 方法的 ExtendRecyclerView 类一起使用。这对我有用!

@Override
protected void onMeasure(int widthSpec, int heightSpec) 
    int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST);
    super.onMeasure(widthSpec, expandSpec);

【讨论】:

【参考方案7】:
recyclerView.setNestedScrollingEnabled(false);

有时会很有用。但并不总是建议这样做。因为它会禁用 recycler 视图中的视图回收功能。

替代方案:

尝试使用 Recycler 视图的 CollapsiveToolbarLayout。 将其他视图放在 collapsiveTollbar 布局中。

【讨论】:

【参考方案8】:

我也遇到过这个问题。 并升级到26.1.0 修复它。

【讨论】:

【参考方案9】:

在我的情况下,我将所有图像放在 drawable-xxxhdpi 文件夹中的可绘制文件夹中,这就是我的屏幕 UI 滞后的原因。

【讨论】:

【参考方案10】:

这是WAI。 NestedScrollView 使用规范“未指定”测量其子级。孩子也可以随心所欲地成长。

这基本上等同于 NSV 和 RV 的高度。所以就RV而言,它认为它是完全显示出来的。

用 LL 包裹您的 RV,并给您的 RV 一个高度。 LL 不会将测量规范设置为未指定,因此 RV 将在您提供的任何 DP 的设置高度内正确滚动。

此方法的唯一缺点是您将无法在 RV 上进行匹配父级。

【讨论】:

【参考方案11】:

您应该将回收器视图包装在任何布局中,例如 LinearLayout,并将 RecyclerView 的大小设置为常量,例如 800dp。这将启用平滑滚动,并且回收器视图在滚动期间仍将回收器视图。

<android.support.v4.widget.NestedScrollView xmlns:android="http://schemas.android.com/apk/res/android"
                                xmlns:app="http://schemas.android.com/apk/res-auto"
                                android:layout_
                                android:layout_
                                android:orientation="vertical">

<LinearLayout
    android:layout_
    android:layout_
    android:orientation="vertical">

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

【讨论】:

这是一个很好的答案,因为它指出了在不破坏 RecyclerView 的主要优点的情况下解决快速滚动问题的方法,即仅加载可见视图并在它们滚动到视线之外时回收它们。人们可能对它投了反对票,因为像 800dp 这样的固定值不适用于所有屏幕尺寸和方向,但 layout_height 值可以通过编程方式计算和设置 - 有点混乱,但它解决了这两个问题。

以上是关于嵌套滚动视图内的 Recyclerview 滚动,但不像普通 Recyclerview 或嵌套滚动视图那样快速滚动的主要内容,如果未能解决你的问题,请参考以下文章

ViewPager2嵌套RecyclerView滑动冲突解决办法

RecyclerView - 如何平滑滚动到嵌套滚动视图内某个位置的项目顶部?

Recyclerview 滚动在嵌套滚动视图中的片段中不起作用

嵌套滚动视图中的 RecyclerView 最初加载缓慢

嵌套的scrollview + recyclerview,奇怪的自动滚动行为[重复]

嵌套的 RecyclerView 滚动无法向下滚动 ViewPager2 的 BottomSheetBehavior