在学习Android开发的过程中,大家应该或多或少的会接触到ListView这个控件。那么,大家有没有思考过,一个屏幕只能显示一定的item,每次下滑后,消失的item去哪里了?当再次回到原来的位置的时候,加载出来的item是重新获取的还是从缓存空间里提取的呢?接下来,我们通过分析RecycleBin机制来探寻ListView的缓存机制。
RecycleBin的基本原理
RecycleBin中有两个数组,mActiveViews和mScrapViews分别存储可以直接复用的view(处于可见状态的view)和间接复用的view(处于不可见状态的view)。当屏幕向下滑动的时候,顶部view不可见时,会将其回收至RecycleBin中的mScrapViews数组中进行保存,底部需要显示一个新的View时,会从mScrapViews中取出一个View传至convertView进行复用。
在ListView中,重写addView方法,当调用时,会抛出异常。ListView是一帧一帧绘制的,会经历measure->layout->draw方法。在ListView布局的时候,会调用layoutChildren方法绘制子View。当刚开始执行layout的时候,ListView的children是上一帧中需要绘制的view的集合,当layout执行完毕时,children变成当前帧需要绘制的子View的集合。
当一个view不可见时,首先会将该view移至RecycleBin。会根据数据是否发生变化调用不同的方法。如果数据发生变化,会将所有字View移至RecycleBin的mScrapView数组中进行保存,数据未发生改变在将当前View放入m