【参考链接】
AndroidListView工作原理完全解析,带你从源码的角度彻底理解http://blog.csdn.net/guolin_blog/article/details/44996879
ListView当中使用了View复用机制
其父类AbsListView中有个RecycleBin子类,其中有ActiveViews和ScrapViews两个成员变量,主要是ScrapViews的作用。
其中
在进行初始的测量、布局时
会先将子Views全部移动到ActiveViews中(就是改变数组的引用),并用mFirstActivePosition记录下第一个item在datas中的position
然后从上至下重新获取子View
根据position
先从ActiveViews中获取
如果获取的到,则再将其从ActiveViews移动到子Views中,
如果获取不到,则先从ScrapViews中获取一个View,作为contentView参数,传递给Adapter的getView()方法,返回一个View添加到子Views中
完了以后ActiveViews中剩下的View再移动到ScrapViews中
在滑动的时候
会通过改变子Views的mTop、mBottom属性来达到移动的效果
如果有子View移出了界面,则将其移动到ScrapViews中
如果有新的item要移入界面,则按照上面的获取逻辑去获取新的子View并添加到子Views中
所以,通过移动到ScrapViews 和从ScrapViews中获取并转换使用,移出屏幕的子View会很快会被移入屏幕的重新利用起来。
此外,上面的流程中
从子Views中移除 和添加到子Views中,使用的方法是detachViewFromParent()和attachViewToParent()
这两个相对于addView()和removeView()要轻量一些,只是删除了子Views数组的引用,省去了调用requestLayout()、重新生成LayoutParams等操作,有助于效率。