NestedScrollview 内的 RecyclerView 滚动不顺畅

Posted

技术标签:

【中文标题】NestedScrollview 内的 RecyclerView 滚动不顺畅【英文标题】:RecyclerView inside NestedScrollview not scrolling smoothly 【发布时间】:2019-05-25 17:33:54 【问题描述】:

当我向下滚动时,RecyclerView 上方的项目不会滚动,除非我从上面的布局开始触摸,并且只有当我到达 RecyclerView 的末尾时它才会向下滚动。

<NestedScrollView
    android:layout_
    android:layout_>
    <LinearLayout>
        <Some other items.../>
    </LinearLayout>

    <RecyclerView
         android:layout_
         android:layout_/>
</NestedScrollView>

注意: 我实际上为 RecyclerView 使用了固定大小,通过下面的代码设置它:

float height_recyclerview = (ScreenUtil.getHeight(context) - (height_banner + height_bottom_navigation + height_create_post));
LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, (int) height_recyclerview);
rv.setLayoutParams(layoutParams);

为什么如果它与wrap_content 兼容,我要使用固定大小?

我将展示可能有数千个项目 图像,如果它实际上不这样做会损害性能 回收因为RecyclerView 在里面 NestedScrollView 我已经实现了一个 EndlessRecyclerViewScrollListener,它有一个 如果它不断从服务器加载更多数据的问题 使用可滚动的 RecyclerView 实现 视图,或者如果它在可滚动视图中,但没有固定的 高度,即使您没有向下滚动。

我已尝试以下方法:

在回收站视图中将嵌套滚动设置为 false 尝试使用滚动视图而不是嵌套滚动视图 其他人建议的与布局和滚动行为相关的一堆其他代码对我不起作用,因为我在更复杂的布局中实现它并且我使用 EndlessRecyclerViewScrollListener 的事实

什么我要修复?

我想让页面像单个页面一样滚动,而不是作为单独的可滚动视图。

请注意,我的回收站视图有一个固定的高度,它占据了整个屏幕的空间,这意味着如果用户向下滚动,上面的线性布局不再可见,它的高度实际上是合适的。

理想的场景是让scrollview先向下滚动,让recyclerview占据整个屏幕,这样recyclerview就可以按照用户的意愿滚动​​。

然后,如果回收站视图占用了屏幕的所有空间,则上面的线性布局应该不再可见,只有当回收站视图到达顶部/第一项时,如果用户继续向上滚动,则应该只显示.

【问题讨论】:

【参考方案1】:

Read this.

app:layout_behavior="@string/appbar_scrolling_view_behavior" 添加到您的回收站 xml。

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

【讨论】:

我没有禁用嵌套滚动。但我的问题是回收站视图上方的布局不会相应地滚动。而且..如果我禁用嵌套滚动。回收站视图根本不会滚动。 还是一样。我的目标是让滚动视图首先向下滚动,直到回收器视图适合屏幕。这样我的 recyclerview 就会根据用户的需要滚动。并且只有当用户继续向上滚动时,recyclerview 到达顶部时,上面的线性布局才会再次显示。【参考方案2】:

NestedScrollView 平滑滚动

recyclerView.isNestedScrollingEnabled = true

以编程方式执行此操作

 <androidx.core.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:fillViewport="true"
        ...

【讨论】:

我已尝试禁用嵌套滚动。并且由于某种原因,回收站视图根本不滚动,因为我的回收站视图具有固定大小。但是,如果 recyclerview 是使用 wrap_content 实现的,它确实可以很好地滚动。这就是我启用它的原因。并启用嵌套滚动。我有我刚刚在上面发布的问题。 @Rick 你添加了那行吗? 是的,我刚刚尝试过,但遗憾的是,它仍然无法按照我想要的方式工作。还是一样 好的,你的 UI 要求是什么? 即使我开始在 recyclerview 内部触摸,也让嵌套的滚动视图向下滚动。因为如果我开始触摸 recyclerview 内部然后滚动,只有 recyclerview 向下滚动。

以上是关于NestedScrollview 内的 RecyclerView 滚动不顺畅的主要内容,如果未能解决你的问题,请参考以下文章

无法滚动到 NestedScrollView 内的 RecyclerView 中的项目

NestedScrollView 内的回收器视图导致滚动从中间开始

NestedScrollView 内的 RecyclerView :使水平滚动更容易

ConstraintLayout 内的 NestedScrollView 不可滚动

NestedScrollView 内的子级未覆盖整个屏幕高度

NestedScrollview 内的 RecyclerView 滚动不顺畅