大家好,我近期刚完成了一个商城类的软件,首页就是用recyclerview的多布局实现的,近期的优化让我不得不去深入的了解一下recycleview这个控件。
我遇到的第一个问题就是滑动时候卡顿,无法忍受,于是就在网上找了很多文章,看了很多代码,在这里就给大家总结一下这两天我觉得对这个问题处理有效的解决方式。
1.recyclerview的item加载顺序
recyclerview 的使用大家肯定不陌生了,但是每个item的加载顺序还是有必要了解一下的,知道item显示出来的流程。
getItemViewType(获取显示类型,返回值可在onCreateViewHolder中拿到,以决定加载哪种ViewHolder)
onCreateViewHolder(加载ViewHolder的布局)
onViewAttachedToWindow(当Item进入这个页面的时候调用)
onBindViewHolder(将数据绑定到布局上,以及一些逻辑的控制就写这啦)
onViewDetachedFromWindow(当Item离开这个页面的时候调用)
onViewRecycled(当Item被回收的时候调用)
2.复杂布局
好多文章都说过这个办法,的确是有效,但是这个效果也就因人而异吧,我的只能说是缓解了一点点的卡顿,
对于列表来说,不管用RecyclerView 还是ListView,我们都会用ViewHolder来复用布局。但是,即使这样做了,还是会出现卡顿,。
1.尽量减少布局嵌套,层级越深,每次测量时间久越久。
2. 如果布局很复杂,可以考虑自定义布局能不能实现。
3.尽量减少过度绘制区域。这个可以在开发者选项中看到:调试GPU过度绘制。
我们对于滚动过程中,卡顿的判断可以打开手机开发者选项中的:GPU呈现模式分析->在屏幕上显示为条形图。就可以非常直观的看到滑动过程中有没有卡顿了。
3.优化图片加载
我在别的文章中看到并且用在了自己的软件中,图片加载的优化是最有效的办法,而且很多主流的app中新浪微博,qq,今日头条等也在使用,因为列表在滚动过程中,如果布局很复杂,样式也很多,那就需要考虑滚动的时候不做复杂布局及图片的加载,尽量减少滚动过程中的耗时操作,这样滚动停止的时候再加载可见区域的布局,因为这个时候是停止状态,即使略微耗时一些用户的感知也是比较小的,就会给人一种不卡的假象。
从代码中可以看到 主要就是对onScrollStateChanged方法进行监听,然后通知adapter是否加载图片或复杂布局。
如果有不熟悉 onScrollStateChanged 方法的朋友可以看一下下面的介绍
在void onScrollStateChanged(RecyclerView recyclerView, int newState)中回调两个变量:
recyclerView : 当前在滚动的RecyclerView
newState : 当前滚动状态.
其中newState有三种值:
//正在滚动 public static final int SCROLL_STATE_IDLE = 0; //正在被外部拖拽,一般为用户正在用手指滚动 public static final int SCROLL_STATE_DRAGGING = 1; //自动滚动开始 public static final int SCROLL_STATE_SETTLING = 2;
下面是我适配器里的方法在adapter中定义一个boolean类型的变量。通过recycleview的 onScrollStateChanged的方法来对这个boolean值进行改变,从而控制加载图片。
有问题去解决,总归RecyclerView是非常棒的控件,值得去学习,使用。
大家有什么问题可以留言,一起学习交流,或者有什么更好的办法,欢迎分享。