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被回收的时候调用)

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

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

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

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

处理方法

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

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

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

进阶用法

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