Android NestedScrollView嵌套RecyclerView滑动卡顿问题终极解决方案

如果是如下的页面布局:NestedScrollView嵌套RecyclerView
在这里插入图片描述
随着recyclerVIew的加载,item越多,会发现滑动卡顿;大致解决方案有以下两种:

方案1:取消recyclerVIew的滑动

	mRecyclerView.setNestedScrollingEnabled(false);

这种方案可能解决绝大部分问题。但是如果item中是加载的图片。但是可能就不起作用了。
可以尝试方案二;

方案2:采用 CoordinatorLayout + AppBarLayout解决

即用AppBarLayout包裹列表以外需要滑动的view。这样就可以实现联动了;注意此时一定不能设置

mRecyclerView.setNestedScrollingEnabled(false);

核心代码如下:

 <androidx.coordinatorlayout.widget.CoordinatorLayout
            android:id="@+id/layout_data"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:overScrollMode="never"
            android:scrollbars="none">

            <com.google.android.material.appbar.AppBarLayout
                android:id="@+id/mAppBarLayout"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:background="@null"
                android:fadingEdge="none"
                app:elevation="0dp">

                <androidx.core.widget.NestedScrollView
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:orientation="vertical"
                    android:overScrollMode="never"
                    android:scrollbars="none"
                    app:layout_scrollFlags="scroll|exitUntilCollapsed">

                    <ImageView
                        android:id="@+id/iv_top"
                        android:layout_width="match_parent"
                        android:layout_height="76dp"
                        android:scaleType="fitXY"
                        android:src="@mipmap/ic_estimate_title" />


                </androidx.core.widget.NestedScrollView>

                <View
                    android:layout_width="match_parent"
                    android:layout_height="0dp"/>

            </com.google.android.material.appbar.AppBarLayout>

            <RelativeLayout
                android:id="@+id/relativeLayout"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                app:layout_behavior="@string/appbar_scrolling_view_behavior">

                <androidx.recyclerview.widget.RecyclerView
                    android:id="@+id/recyclerView"
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                    android:layout_marginLeft="-8dp"
                    android:layout_marginRight="-8dp"
                    android:background="@color/color_bg"
                    android:divider="@color/trans"
                    android:horizontalSpacing="0dp"
                    android:listSelector="@color/trans"
                    android:overScrollMode="never"
                    android:scrollbars="none"
                    android:verticalSpacing="12dp" />

            </RelativeLayout>


        </androidx.coordinatorlayout.widget.CoordinatorLayout>

大功告成!

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在使用 AndroidNestedScrollView 嵌套 RecyclerView 的过程中,出现了数据无法复用缓存的问题,这是因为 RecyclerView 的复用机制并不适用于 NestedScrollView 中的嵌套情况。 NestedScrollView 中包含的 RecyclerView 实际上是作为一个子View 的形式出现的,而每一个子View 的布局和数据都是不同的,所以 RecyclerView 无法反复利用之前已经使用过的缓存。这会导致在滑动过程中不断创建新的ViewHolder,从而降低应用程序的性能。 为了解决这个问题,可以将 RecyclerView 操作放到调用 NestedScrollView 的 onScrollChanged() 方法里面,以确保它的缓存机制被正确使用。另外,为RecyclerView设置setHasFixedSize(true)属性可以使性能有一些提升。 最好的解决方案是使用单个 RecyclerView 以及多个 Adapter 对其进行管理。这种方法可以让您更好地控制与管理 RecyclerView 的数据,在保证 NestedScrollView 能够适当地管理视图树的同时,确保 RecyclerView 没有内存和性能问题。 ### 回答2: Android中,RecyclerView是一个非常高效的列表控件,它可以使用ViewHolder机制对视图进行缓存,减少频繁更新视图的开销,但是在使用NestedScrollView嵌套RecyclerView时,却会出现数据无法复用缓存的问题。 这是因为NestedScrollView默认会将RecyclerView的所有子视图都展开,导致RecyclerView中所有的子视图都处于可见状态,无法被缓存。因此,当列表滑动时,RecyclerView会重新实例化缓存的ViewHolder,以展示新的子视图。这个过程会消耗大量的内存和CPU,导致RecyclerView变得非常缓慢,甚至会导致OOM崩溃等问题。 为了解决这个问题,我们需要使用一些技巧来保证RecyclerView的子视图只有在需要的时候才被展开。一种解决方案是通过设置NestedScrollView的fillViewport属性为false,使NestedScrollView不将RecyclerView的所有子视图都展开。这样做可以让RecyclerView正确地使用ViewHolder机制,但是在滑动过程中,子视图的高度会频繁变化,导致列表的抖动,用户体验也会受到一定的影响。 另一种解决方案是使用RecyclerView的setRecycledViewPool()方法,为RecyclerView缓存一个视图池,这个视图池可以在RecyclerView的所有嵌套层级间共享,让所有子视图都可以被重复使用。这个方案的优点是可以减少在滑动过程中子视图高度变化带来的问题,但是需要在代码中进行额外的编写。 总之,NestedScrollView嵌套RecyclerView在使用时要注意子视图的缓存问题,需要通过调整布局属性或使用RecyclerView的视图池等技巧来解决。 ### 回答3: Android嵌套滑动规范是在Android 5.0(API level 21)中引入的,用于使父View和子View之间的滑动效果更加协调。而NestedScrollViewRecyclerView都是Android中常用的滑动控件,但是在嵌套使用的过程中,RecyclerView的数据无法复用缓存,这是为什么呢? 首先,我们需要了解RecyclerView的缓存机制。RecyclerView使用三种缓存机制:首先是ViewHolder缓存,它可以在滑动时快速重新绑定已经存在的ViewHolder对象;其次是View缓存,它缓存了滑出屏幕的View,可以加速滑动时的UI响应;最后是Bitmap缓存,它用于缓存在RecyclerView中的图像。 然而,在嵌套使用NestedScrollViewRecyclerView时,RecyclerView的缓存机制无法发挥作用。这是因为NestedScrollView滑动事件先处理,然后再将滑动事件交给RecyclerView处理,这会重新调用RecyclerView的Adapter中的getView()方法,导致RecyclerView中的缓存被清空。因此,RecyclerView的数据无法复用缓存,会造成性能上的损失。 为了解决这个问题,可以采取以下措施: 1.不要嵌套滑动控件:尽量避免使用NestedScrollViewRecyclerView嵌套滑动控件。 2.使用LayoutManager:使用LayoutManager可以缓存RecyclerView的ViewHolder对象,加速滑动过程中的UI响应。 3.自定义LayoutManager:自定义LayoutManager可以对滑动速度、滑动方向等进行优化,提高RecyclerView的性能。 4.使用分组显示:对RecyclerView的数据进行分组,将分组内的数据合并成一张图片,然后将图片缓存起来,这样可以减少RecyclerView的刷新次数。 总的来说,NestedScrollViewRecyclerView嵌套使用会导致RecyclerView的缓存无法复用,降低RecyclerView的性能,因此需要采取一些措施来解决这个问题。使用LayoutManager、自定义LayoutManager、分组显示等方法可以优化RecyclerView的性能,提高用户体验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值