Android的ListView可以算是最古老的UI控件了,
但是它有很多设计上的思想可以借鉴学习。
回顾一下, 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。
通常在 Android初级的面试中会涉及到这个问题, 就是如何优化 ListView, 一般由浅到深的思路是这样的, · 复用 convertView · 自定义 ViewHolder,用 converView的 setTag把 ViewHolder对象设进去 然后再复用的时候用 getTag获得 ViewHolder并改变它的数据 减少渲染UI的时间 · 对于包含 Bitmap的 ListView,用 Cache将 Bitmap对象缓存起来, · 更进一步,可以设计三级缓存来管理占用大内存对象,比如 Bitmap · 用异步的形式延迟 Bitmap渲染,产生顺滑的滑动效果 · 用 RecyclerView 替代 ListView
其实 ListView的局限很明显, 最简单的是它不能提前渲染 item, 这就造成当我们尝试用异步的方式来延迟渲染的时候有可能会让 UI跳动。
原因很简单, 每个 item可能高度不一样, 在延迟渲染完成后高度发生了变化,这就导致整个UI发生跳动, 这样的问题在一些复杂的场景下很难解决, 所以最简单直接的办法是。。。 用 RecyclerView吧。。。