ListView的优化
ListView是Android中最常见也是最难用的控件,可以说现在市面上的Android应用都会包含ListView,因此掌握ListView对于Android开发来说是十分重要的。这里主要说一下ListView常见的几个优化的方向。
1、不进行优化:
每次getView()的时候都会执行
View view = View.inflate(mContext,R.layout.item,null);
问题:效率太低,在快速滑动的时候会造成卡顿,数据量比较大的时候会造成内存溢出,感兴趣的小伙伴可以尝试一下用一个for循环往ListView中添加几百条数据,然后快速的上下滑动,这时候程序很容易就会以为内存溢出的问题导致崩溃。
2、一级优化:复用converview
if(converterView==null) {
converterView = View.inflate(mContext,R.layout.item,null); //n+1
}
问题: 每次执行getView()都需要执行converterView.findViewById()得到子View
3、二级优化:使用ViewHolder, 减少findViewById()的次数
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder viewHolder;
if(convertView == null){
convertView = View.inflate(mContext, R.layout.ui_adapter,null);
viewHolder = new ViewHolder();
viewHolder.iv = (ImageView) convertView.findViewById(R.id.iv_ui_adapter);
viewHolder.title = (TextView) convertView.findViewById(R.id.title_ui_adapter);
viewHolder.content = (TextView) convertView.findViewById(R.id.content_ui_adapter);
convertView.setTag(viewHolder);
}else{
viewHolder = (ViewHolder) convertView.getTag();
}
viewHolder.iv.setImageResource(R.mipmap.ic_launcher);
viewHolder.title.setText(mList.get(position).getTitle());
viewHolder.content.setText(mList.get(position).getContent());
return convertView;
}
static class ViewHolder{
private ImageView iv;
private TextView title;
private TextView content;
}
问题1: 对于联网获取列表数据, 如果包含图片数据,使用图片的三级缓冲技术: 第三级优化
问题2: 对于联网获取列表数据, 如果数据量太大,使用分页加载: 第四级优化
4、三级优化:图片的三级缓存
图片的三级缓存
一级缓存: 内存缓存, 缓存的是bitmap对象, 用Map<String, Bitmap>结构保存, key是url
二级缓存: 本地(sd卡)缓存, 缓存的是图片文件
三级缓存: 远程服务器缓存, 缓存的是图片文件, 在远程服务器上的应用中
5、四级优化:对数据列表进行分页加载显示
1)、通过Scroll监听listView.setonScrollListener(scrollListener), 当到达底部时加载下一页列表数据并显示
2)、使用第三方开源框架: Android-PullToRefresh