ListView和RecycleView

# ListView和RecycleView > Create Time : 2020/04/03 > Author:licoba ## 一、ListView的优化 ### 值得优化的地方 - 每次滑动显示item的时候,都会走到getView方法里面去,如果每次getView都需要用View.inflate方法去获取一个新的view,会引起内存上的增加,并且View.inflate方法是将xml文件解析成为View对象,如果item的构成比较复杂的话,这个步骤将是一个非常耗内存的操作。 - findViewById这个操作也是比较耗时的,因为这个方法要找到指定的布局文件,进行不断地解析每个节点:从最顶端的节点进行一层一层的解析查询,找到后在一层一层的返回,如果在左边没找到,就会接着解析右边,并进行相应的查询,直到找到位置。 ### 优化方法 - 复用getView方法中的convertView 在getView方法中,ListView为我们提供了一个convertView对象,这个对象就是ListView的历史缓存对象,我们可以在convertView不为空的时候去复用他,而不用去new一个对象,这样可以减少内存上的损耗。 - 使用ViewHolder减少findViewById的使用 ViewHolder可以设置成为一个静态类,ViewHolder里面只用存储需要findViewById的对象;通过converview的setTag和getTag方法将view与相应的holder对象绑定在一起,避免不必要的findviewbyid操作 - item的布局层次尽量不要做太深,避免View的过度绘制 - 避免在 getView 方法中做耗时的操作,比如图片加载,可以用异步加载来完成,等待滑动完毕之后再去加载图片,这里可以用Glide来实现。在用户过度滑动ListView时停止加载item里面的图片。因为从用户的角度来讲,用户在快速滑动的时候不需要非常看清楚item里面的图片,并且加载图片是一个比较耗时的操作,特别是从网络加载图片的时候. - 图片加载的三级缓存优化 1. 内存缓存 优先加载,速度最快 2. 本地缓存 次优先加载 速度稍快 3. 网络缓存 最后加载 速度由网络速度决定<br> 也就是优先加载内存中的图片,其次再考虑将重复的图片缓存到本地,避免加载时的网络请求,最后才考虑加载网络上缓存的图片 - 可以使用RecycleView来代替ListView,listView每次数据有变化都会调用notifyDataSetChanged来刷新整个列表,使用RecycleView可以实现item的局部刷新 - 分页加载 当数据量过大的时候,可以考虑做分页加载,来减少列表过长的时候容易出现的卡顿现象。 ### 总结 - 复用convertView - 使用ViewHolder来代替findViewById - 异步加载图片 - 图片三级缓存 - 使用RecycleView局部刷新item - 分页加载 ## 二、ListView和RecycleView的区别 或者说RecycleView相比ListView起来有什么优势? 1. RecyclerView的Adapter里面已经封装好了ViewHolder,不用自己写了 2. RecycleView可以提供局部刷新的方法 3. RecycleView使用了四级缓存,ListView使用了两极缓存 4. RecycleView相比起ListView起来更灵活丰富,例如动画效果、拖动效果等 5. RecycleView在嵌套滚动方面支持比较足,例如RecycleView向上滑动的时候能收起其它layout