关于RecyclerView与ScrollView嵌套产生的坑

RecyclerView 多重嵌套有时候是很常见的用法,但是lz在这里发现了一个惊人的bug,导致oom。

当Recyclerview 外部嵌套了一层可滑动布局时,lz表示我发现一个大的bug,当RecyclerView 外层嵌套滑动布局时 

RecyclerView 的回收复用机制将失效,lz亲测 当外层是滑动布局时 RecyclerView 的Adapter 中的 item 滑出屏幕以及

item 的回收方法将不再调用。

下面我们看看为什么会产生这个问题。

第一先了解小RecycleView 的执行顺序:

getItemViewType(获取显示类型,返回值可在onCreateViewHolder中拿到,以决定加载哪种ViewHolder)

onCreateViewHolder(加载ViewHolder的布局)

onViewAttachedToWindow(当Item进入这个页面的时候调用) 

onBindViewHolder(将数据绑定到布局上,以及一些逻辑的控制就写这啦)

onViewDetachedFromWindow(当Item离开这个页面的时候调用)

onViewRecycled(当Item被回收的时候调用)

先向下再向上滑动.png

当item不可见时会先调用onViewDetachedFromWindow这方法,紧接着回收时会调用onViewRecycled这方法,但是

lz在这两个方法中打印了日志发现这两个方法并没有被执行。可是这是为什么呢。

RecyclerView默认是setNestedScrollingEnabled(true),是支持嵌套滚动的,也就是说当它嵌套在NestedScrollView中时,默认会随着NestedScrollView滚动而滚动,放弃了自己的滚动

这就导致了一个问题 RecycleView加载更多时上部已近绘制的布局将占据布局中的位置且不能回收,因此在数据非常多的情况下会出现oom,因为一直往下滑的情况下item是一直进行的新建并且没有进行回收导致内存急剧上升从而产生oom。

处理方法

一.将需要滑动的布局放入RecycleView中 去掉NestedScrollView 滑动布局。

二.将RecycleView 中的setNestedScrollingEnabled(false);属性设置成false,将滑动交由RecycleView 自己处理。

另外我还没找到更好得到处理方式,有哪位大神 有更好的处理方式请给我留言。

进阶用法

当item中含有数量较多的图片时可在onViewRecycled中进行图片的回收处理,还有终止图片的网络请求等,这样可以非常有效的进行内存的释放,防止产生oom异常。

 

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值