Android NestedScrollView嵌套RecyclerView的问题

问题出现原因

想做到这么一种效果,页面中既有轮播图,又有RecyclerView,当RecyclerView上滑时,轮播图会消失。
在这里插入图片描述
在这里插入图片描述
而这样就会出现一个问题。

具体的问题

打印出log,分别在适配器中的onBindViewHolder和onCreateViewHolder 也打印log。
在这里插入图片描述
这里准备的数据有52条,结果这一下全部加载出来了,这样就造成内存吃紧的情况。
而且我们加载更多数据的时候,也会出现这种情况。
按照我们正常的RecyclerView的使用,我们的onCreateViewHolder 不会有么多次的调用,只会有展示窗口的大小能容纳下的item个数。
onBindViewHolder 是正常的,它会每次给展示的几个item 动态更换内容,从而完成对item的复用。
但是这里每一次都会调用(它的调用就意味着对象的创建)。这就问题蛮大了。
在这里插入图片描述

通过获得Recyclerview的高度,就会发现Recyclerview高度有点长的过分了。
这里的问题就在于NestedScrollView嵌套RecyclerView 会出现这情况。

解决方案

因为NestedScrollView,导致RecyclerView 全部加载出来了。
只需要给我们的RecyclerView 动态的设置一个固定的长度。这样RecyclerView就能根据手机屏幕展示的大小,从而简单的调用几个onCreateViewHolder()。不会想之前那样多次调用了。

具体解决

怎么解决已经有了思路,就获得屏幕长度即可,这里说的屏幕长度,是指的完全展示RecyclerView所需的长度。(这里因为因为可能存在一些标题栏,底

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答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的性能,提高用户体验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值