ListView解析
直接继承自AbsListView,AbsListView继承自AdapterView,AdapterView又继承自ViewGroup。算法
Adpater在ListView和数据源之间起到了一个桥梁的做用数组
RecycleBin机制缓存
RecycleBin机制是ListView可以实现成百上千条数据都不会OOM最重要的一个缘由。RecycleBin是AbsListView的一个内部类。
- RecycleBin当中使用mActiveViews这个数组来存储View,调用这个方法后就会根据传入的参数来将ListView中的指定元素存储到mActiveViews中。
- mActiveViews当中所存储的View,一旦被获取了以后就会从mActiveViews当中移除,下次获取一样位置的时候将会返回null,因此mActiveViews不能被重复利用。
- addScrapView()用于将一个废弃的View进行缓存,该方法接收一个View参数,当有某个View肯定要废弃掉的时候(好比滚动出了屏幕)就应该调用这个方法来对View进行缓存,RecycleBin当中使用mScrapV
- iews和mCurrentScrap这两个List来存储废弃View。
- getScrapView 用于从废弃缓存中取出一个View,这些废弃缓存中的View是没有顺序可言的,所以getScrapView()方法中的算法也很是简单,就是直接从mCurrentScrap当中获取尾部的一个scrap view进行返回。
- 咱们都知道Adapter当中能够重写一个getViewTypeCount()来表示ListView中有几种类型的数据项,而setViewTypeCount()方法的做用就是为每种类型的数据项都单独启用一个RecycleBin缓存机制。
到此为止,这就很好的解释了为何Listview加载上百条数据都不会形成OOM了的缘由了