Listview定义
Listview就是一个将数据集合以动态滚动方式展示到用户界面上的View
Listiew适配器模式
Adapter是数据源和Listview之间的桥梁,Adapter负责为每个数据制作View,然后交给Listview显示
Listview的RecycleBin机制
当adapter中有成百上千条数据的时候,ListView怎么展示这些数据呢,如果是一次性全部绘制,手机的性能肯定是不支持的,就算支持,意义也不大,因为屏幕就这么大,一次只能展示几条数据;基于这种情况,Android为Listview设计了RecycleBin机制,即对子View进行回收利用
RecycleBin:从字面意思来看就是回收站的意思
- 某一时刻,Listview里有几个item出现在屏幕上,这些item对应的View可以称作OnScreen的View,即在屏幕中能看到的View,也是ActiveView,可以称为活动的View,因为是可以操作的;
- 当Listview向上滑动的时候,一些可见View上移,直到移出屏幕范围变成不可见View,叫做OffScreen的View,也是ScrapView,即废弃的view;这些废弃的View,Listview会把它们保存在RecycleBin中,就像把暂时无用的资源放到回收站中一样
- 当Listview往上滑动,底部新出来的Item需要显示,但是Listview并不会再次通过LayoutInflater实例化出一个View出来给新的item用,因为那样就太消耗性能和内存了;而是会从RecycleBin中取出前面保存的Scrapview,将其作为参数传递给Adapter的getView,从而达到复用的目的。
简而言之:假设屏幕最多能看到11个item,那么当第1个item滚出屏幕,这个item的View进入RecycleBin中,第12个要出现前,通过getView从回收站(RecycleBin)中重用这个View,然后设置数据,而不必通过LayoutInflater重新创建一个View
RecycleBin中有两个很重要的集合
View[] mActiveViews 存储的是OnScreen的View
ArrayList[] mScrapViews 存储的是OffScreen的View
Listview优化
- 复用Convertview,这样就不必每次都通过LayoutInfalter.from(getContext()).inflate(resourceID,null)加载View,这个主要是优化加载布局的过程
- ViewHolder保存了每个控件的实例,可以避免频繁findviewbyid去实例化控件,这个主要是优化加载控件的过程
- 三级缓存,减少网络耗时操作
- listview停止时再加载图片