最近在商城项目中,首页布局设计的十分复杂,出现了需要recycleview互相嵌套才能实现的情况。费劲千辛万苦终于实现了效果,但是又出现一个令人头疼的问题:快速滑动页面会产生卡顿。于是,又一轮优化之旅就开启了:
1.万年不变的过度绘制:打开手机开发者选项中的过度绘制功能,修改布局(如去掉重复背景、减少布局层次)将页面中所有红色部分(过度绘制)尽量消除;
2.监听recycleview滑动状态,当滑动停止时加载图片,否则暂停加载;
3.对于内层recycleview,由于嵌套的原因,每个都会新建自己的视图池(viewpool),此处new一个全局变量,给所有内层recycleview指定同一个viewpool,增加视图复用,减少内层压力;
4.设置recycleview的缓存
mRecyclerView.setItemViewCacheSize(20);
mRecyclerView.setDrawingCacheEnabled(true);
mRecyclerView.setDrawingCacheQuality(View.DRAWING_CACHE_QUALITY_HIGH);
mRecyclerView.setNestedScrollingEnabled(false);
给内外层recycleview设置预加载数量:
manager.setInitialPrefetchItemCount(12);
取消默认动画:rv.setItemAnimator(null);
优化adapter中的逻辑(例如多用增强for循环、减少new onclicklistener使用全局onclicklistener)等。
经过上述一系列的优化操作,卡顿问题终于得到解决。
PS:在网上还看到另外一种解决方案:将列表中的所有视图(包括需要嵌套的recycleview)都当做footerView和headerView添加到外层的recycleview中,这种方案也亲测可以解决卡顿问题,但是容易引起内存溢出,慎用!