ListView的相关总结

356 阅读2分钟
原文链接: mp.weixin.qq.com

Android的ListView可以算是最古老的UI控件了,

但是它有很多设计上的思想可以借鉴学习。

LitView的使用

回顾一下,ListView的使用其实非常简单,只需要提供一个 UI,提供一个装载数据的 Adapter,在 Adapter的 getView 方法里实现每个 item需要渲染的UI,再把 item 返回给 ListView就可以。

我们先回想一个问题,假设一个列表有 1000 个数据,那么是否是说 ListView 就有 1000 条 UI呢?

结果当然是否定的,这样对于内存和CPU是极大的浪费。其实每个在可见 UI之外的 item并不一定会被销毁,而是会被重用,如果你尝试在 getView 方法中这么写的话,

....    if(converView != null) {        return convertView;    }    convertView = ....//这里生成一个新的 Item    return convertView;

就会发现在滑动列表的时候会出现已经离开屏幕的那些 item。

ListView的优化

通常在 Android初级的面试中会涉及到这个问题,就是如何优化 ListView,一般由浅到深的思路是这样的,· 复用 convertView· 自定义 ViewHolder,用 converView的 setTag把 ViewHolder对象设进去  然后再复用的时候用 getTag获得 ViewHolder并改变它的数据  减少渲染UI的时间· 对于包含 Bitmap的 ListView,用 Cache将 Bitmap对象缓存起来,· 更进一步,可以设计三级缓存来管理占用大内存对象,比如 Bitmap· 用异步的形式延迟 Bitmap渲染,产生顺滑的滑动效果· 用 RecyclerView 替代 ListView

ListView的局限

其实 ListView的局限很明显,最简单的是它不能提前渲染 item,这就造成当我们尝试用异步的方式来延迟渲染的时候有可能会让 UI跳动。

原因很简单,每个 item可能高度不一样,在延迟渲染完成后高度发生了变化,这就导致整个UI发生跳动,这样的问题在一些复杂的场景下很难解决,所以最简单直接的办法是。。。用 RecyclerView吧。。。