提一个问题:假设ListView中有10W个条项,那内存中会缓存10W个吗?答案当然是否定的。那么是如何实现的呢?下面这张图可以清晰地解释其中的原理:

    • 新进入的View2与View1类型相同,那么在getView方法传入的convertView就不是null而就是View1。换句话说,View1被重用了

    ListView的优化(以异步加载Bitmap优化为例)

    首先概括的说ListView优化分为三级缓存:

    • 内存缓存
    • 文件缓存
    • 网络读取

    这里有几个注意的优化点:

    1. 文件加载图片放在子线程实现,否则快速滑动屏幕会卡
    2. 开启网络访问等耗时操作需要开启新线程,应使用线程池避免资源浪费,最起码也要用AsyncTask。
    3. Bitmap从网络下载下来最好先放到文件系统中缓存。这样一是方便下一次加载根据本地uri直接找到,二是如果Bitmap过大,从本地缓存可以方便的使用Option.inSampleSize配合Bitmap.decodeFile(ui, options)或Bitmap.createScaledBitmap来进行内存压缩

    此外Github上也有仓库:https://github.com/geniusgithub/SyncLoaderBitmapDemo