1、问题描述
最近才发现的NestedScrollView 嵌套RecyclerView,当RecyclerView内数据量一多起来,简直就是一场灾难
Recyclerview的最大优点自然是在内部view的复用,这样不管是从内存还是流畅性上都有很大的优化,但是一旦嵌套到
NestedScrollView 中,Recyclerview的内容就会一次行加载完成,再也没有什么复用,数据量一多,结果可想而知(
奇怪的是 测试机小米5s-安卓7.0-api24不卡,小米8-安卓9-api28, 小米9卡的不行。。这是为啥)
2、问题分析
getItemViewType(获取显示类型,返回值可在onCreateViewHolder中拿到,以决定加载哪种ViewHolder)
onCreateViewHolder(加载ViewHolder的布局)
onViewAttachedToWindow(当Item进入这个页面的时候调用)
onBindViewHolder(将数据绑定到布局上,以及一些逻辑的控制就写这啦)
onViewDetachedFromWindow(当Item离开这个页面的时候调用)
onViewRecycled(当Item被回收的时候调用)
通过debug或者打印log,我们可以看到,无论我们怎么滑动,onViewDetachedFromWindow,onViewRecycled都不被调用了,
也就是说,view包括图片资源都不会被回收!!
使用NestedScrollView 嵌套RecyclerView无非就是因为, 当前页面有多个需要一起滑动的布局,其中包括一个或者多个RecyclerView,使用NestedScrollView 在外层进行嵌套之后,禁止掉RecyclerView的内部滑动,然后就可以达到整体流畅滑动的效果,在内部数据量少的时候,是没有什么问题的,前提是你要保证以后的数据量也一定是不多的。否则就是埋大坑
3、优化方案
问题就是这么个问题,下面试试优化解决方案
方案一、当item中含有数量较多的图片时对传入的图片进行压缩优化,这个方法有效果但也不是从根本上解决问题
方案二,去掉NestedScrollView ,改用RecyclerView做外层嵌套,内部的一个或者多个RecyclerView以及其他布局都作为外层RecyclerView的item来显示(亲测这个方法效果一般)
方案三、同样是去掉NestedScrollView,不过是改用headerView的方式添加头部内容,与方法二大同小异
4.结论
整了大半天终于搞定了,优化结论如下,不要用RecyclerView或者NestedScrollView 来嵌套RecyclerView!!套完就是卡!!就是给RecyclerView加header、footer就完事了 !!!