ListView[2] 源码解析

来源:互联网 发布:歌曲消原唱软件 编辑:程序博客网 时间:2024/05/18 11:26

【参考链接】

AndroidListView工作原理完全解析,带你从源码的角度彻底理解http://blog.csdn.net/guolin_blog/article/details/44996879

 

ListView当中使用了View复用机制

其父类AbsListView中有个RecycleBin子类,其中有ActiveViewsScrapViews两个成员变量,主要是ScrapViews的作用。



其中

在进行初始的测量、布局时

会先将子Views全部移动到ActiveViews中(就是改变数组的引用),并用mFirstActivePosition记录下第一个itemdatas中的position

然后从上至下重新获取子View

根据position

先从ActiveViews中获取

如果获取的到,则再将其从ActiveViews移动到子Views中,

如果获取不到,则先从ScrapViews中获取一个View,作为contentView参数,传递给AdaptergetView()方法,返回一个View添加到子Views

完了以后ActiveViews中剩下的View再移动到ScrapViews

 



在滑动的时候

会通过改变子ViewsmTopmBottom属性来达到移动的效果

如果有子View移出了界面,则将其移动到ScrapViews

如果有新的item要移入界面,则按照上面的获取逻辑去获取新的子View并添加到子Views

所以,通过移动到ScrapViews和从ScrapViews中获取并转换使用,移出屏幕的子View会很快会被移入屏幕的重新利用起来。

 

 

 

此外,上面的流程中

从子Views中移除 和添加到子Views中,使用的方法是detachViewFromParent()和attachViewToParent()

这两个相对于addView()和removeView()要轻量一些,只是删除了子Views数组的引用,省去了调用requestLayout()、重新生成LayoutParams等操作,有助于效率。