内部嵌套滚动视图的RecyclerView可以滚动,但与普通RecyclerView或Nested Scrollview不同的是它不能进行快速滚动。

102
我正在使用NestedScrollView中的RecyclerView并且它可以工作。但是当我将RecyclerView放在LinearLayout或其他控件中时,它会根据手势以不同的速度滚动。 它会根据手势监听滚动,如果我向上滑动只有一点点,那么它会滚动一点点,而如果我向上快速滑动,则它会快速滚动。 现在我的问题是,NestedScrollView中的RecyclerView确实可以滚动,但是快速滚动不起作用。无论我快速滑动还是慢慢滑动,RecyclerViewNestedScrollView都只会滚动一点点。
如何使我的NestedScrollView或包含在滚动视图中的RecyclerView以不同的速度滚动?

3
recyclerView.setNestedScrollingEnabled(false); 这真的很有效! - Aung Si Min Htet
解决方案在这里。 - maruti060385
请使用 open fun setNestedScrollingEnabled(enabled: Boolean): Unit。希望能对您有所帮助。 - Int0TheRainb0w
11个回答

268

尝试

recyclerView.setNestedScrollingEnabled(false);

17
但是通过这种设置,RecyclerView 将不再回收视图!你对此有什么想法? - MAY3AM
28
我不知道这个答案为什么得到了这么多赞。如果禁用嵌套滚动,则违背了它的目的。如果我想要同时使用嵌套滚动和回收视图,比如CoordinatorLayout、AppBarLayout和RecyclerView怎么办? - Jimit Patel
感谢@JimitPatel,这正是我目前遇到的问题。我在嵌套滚动视图中有一个可回收视图,但我无法滚动。https://dev59.com/Ip3ha4cB1Zd3GeqPV4qL - narancs
1
@Karoly 需要自定义嵌套滚动... 我已经有了... 几个小时后会发布... 目前,我正在旅行。在工具栏后使用回收视图的视差效果中遇到了这个问题。 - Jimit Patel
这确实解决了问题,但正如其他人所评论的那样,如果这禁用了回收,它可能会使用更多的RAM。但是,与其仅仅说明您不理解为什么此答案获得了这么多赞,不如添加您自己的答案来解决此问题,而不是禁用回收。 - Damn Vegetables
显示剩余7条评论

54

默认情况下,setNestedScrollingEnabled仅在API-21及之后的版本中起作用。

您可以使用ViewCompat.setNestedScrollingEnabled(recyclerView, false);来禁用前后API-21(棒棒糖)的嵌套滚动。 文档链接


21

我曾在Android 16上工作,在那里无法使用setNestedSCrollEnabled方法,

于是我采取的做法是停止RecyclerView处理滚动。

就像在LinerLayoutManager中,我通过默认返回false来使canScrollHorizontally、canScrollVertically失效。

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

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

这对我确实起作用了。我有一个RecyclerView,它位于LinearLinear内部,而LinearLinear又位于ScrollView内部。 - FonzTech

11

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

  1. 如果您正在使用RecyclerView,则:

recyclerView.setNestedScrollingEnabled(false);
如果您正在NestedScrollingView中使用LinearLayout,请将LinearLayout放在普通ScrollView中,然后将其滚动设置为。
scrollView.setNestedScrollingEnabled(false);

3

android:overScrollMode="never

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


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

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

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

1
你可以使用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);
}

1
recyclerView.setNestedScrollingEnabled(false);

这有时可能会有用,但并不建议总是使用,因为它会禁用Recycler视图中的视图回收功能。

替代方案:

尝试使用CollapsiveToolbarLayout与Recycler视图,将其他视图放在CollapsiveToolbar布局中。


-2

在我的情况下,我把所有的图片都放在了drawable文件夹中,而不是drawable-xxxhdpi文件夹中,这就是为什么我的屏幕UI会出现延迟的原因。


-2

我也遇到了这个问题。 升级到26.1.0版本解决了它。


-3

这是WAI。NestedScrollView使用“未指定”的规范来测量其子项。子项可以随意增长。

这基本上等同于NSV和RV的高度。因此,就RV而言,它认为自己完全显示。

将您的RV用LL包装并给予RV高度。 LL不会将测量规范设置为UNSPECIFIED,因此RV将在您提供的任何DP的设置高度内正确滚动。

此方法的唯一缺点是您将无法对RV执行match parent操作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接