ListView[2] 源码解析

【参考链接】

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等操作,有助于效率。


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值