实例跟读ListView复用原理

关于ListView复用机制的,现总结如下:
1.ListView的复用是通过内部类RecycleBin来实现的;
2.RecycleBin会为每种ItemType最多保留一屏幕的View,本文中的例子,是11个,慢慢滑动时会是12个。这取决于ItemView的高度、ListView的最大高度,以及数据源的条数。
3.RecycleBin中复用机制只在同一种ItemType中进行。负责复用存储的是对象是ArrayList[] mScrapViews,它是一个二维数组,第一维是ItemType;添加View是在ArrayList的末尾;获取时先根据入参position来查找获取,找不到则取用ArrayList末尾元素。
4.在Android中许多View的调用都会有两次的onMeasure和onLayout,ListView也不例外。从本文的Demo来看,onMeasure调用了三次,onLayout调用了两次。
ListView的复用分两部分来讲:
首先看一下ListView的继承关系:
实例跟读ListView复用原理_第1张图片
1.页面初次绘制的过程;
实例跟读ListView复用原理_第2张图片
2.ListView滑动的过程;
实例跟读ListView复用原理_第3张图片

以上即为本文的主要内容。下面是一些辅助工作。
为了准备这篇文章,我的学习流程是:
一、先在网上看别人写的文章,以做到心里先有个印象。
参考文章:
1.ListView原理分析
2.Android ListView工作原理完全解析,带你从源码的角度彻底理解
3.你真的了解ListView的缓存吗
4.Android AdapterView 源码分析以及其相关回收机制的分析
二、查看和跟读源码,以求证。当遇到不知所向的逻辑分支时,通过在Demo中重写方法并加Log来确定逻辑走向。
我使用的Android版本源码包是4.0的,在Windows系统的PC上,使用的查看工具是Source Insight软件。
另外,在Android Studio中,也直接点击相关类进行源码查看。
三、编写Demo,通过LogCat日志来进一步求证。
本文使用的例子下载链接为:Demo的GitHub地址
Demo中在MainActivity里只布局了一个ListView,并且ListView没有Header和Footer。效果如下:
实例跟读ListView复用原理_第4张图片
页面渲染的Log信息如下:
为了看着更加直观,可以通过修改日志颜色来区分。
实例跟读ListView复用原理_第5张图片

你可能感兴趣的:(Android)