更新:目前已经写了demo,欢迎讨论:Android复杂数据流的“高效”渲染javascript
咱们知道Android中的ListView之因此能够实现item的无限加载,是由于对每一个item的View 进行了缓存复用。ListView的高效性能使得其在App开发中使用很是频繁,本文主要分析在复杂数据展现时如何更加高效的使用ListView,如微博、facebook、twitter等的feed流须要展现很是多的数据类型:新闻、图片、网页连接、视频,这种状况下ListView进行须要缓存各类类型的View,App的内存占用急剧升高……java
首先简单介绍一下ListView的复用原理,咱们知道使用ListView时通常须要结合Adapter使用,继承BaseAdapter时,通常须要实现四个方法:缓存
@Override
public int getCount() {
return 0;
}
@Override
public Object getItem(int position) {
return null;
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
return null;
}复制代码
其中getView是渲染每一个Item时进行回调生成View的,方法参数convertView就是ListView传回能够复用的View,当其不为null时,无需从新建立View,能够直接使用convertView,进行数据渲染便可。其原理是当第一次调用时ListView直接将生成的View缓存到一个ArrayList
当列表中有多种类型的view时,咱们须要实现BaseAdapter中的:性能
@Override
//返回view类型数量
public int getViewTypeCount() {
return super.getViewTypeCount();
}
@Override
//返回每一个Item的类型
public int getItemViewType(int position) {
return super.getItemViewType(position);
}复制代码
这种状况下ListView实际为每种类型的Item设置了一个ArrayList进行缓存:优化
此处以微博为例:ui
咱们能够看到不少类型中都有相同能够复用的部分,如头部、分享操做栏等不少item中都是同样,是否可单独拿出来呢,咱们进行简单的拆分:spa
看到这里,是否是不少同窗以为打开了新世界的大门,急着进行代码的优化?具体的代码不方便贴出来,这里说一下具体实现过程当中碰到的坑:3d
等填完拆分后的坑,运行程序,观察先后的效果,内存占用能够减小10~20m,滑动流畅度也提升很多,在低端手机上的效果尤为明显,掉帧明显减小。很是建议有须要的同窗尝试。code
欢迎关注公众号wutongke,天天推送移动开发前沿技术文章: