ListView的优化分两步:
1.减少getView中的填充View的执行次数
2.减少findViewById的次数
第一步:减少getView中的填充View的执行次数
在ListView中,当条目划出屏幕时,系统会把该条目缓存至内存,当该条目再次进入屏幕,系统在重新调用getView时会把缓存的条目作为convertView参数传入,但是传入的条目不一定是之前被缓存的该条目,即系统有可能在调用getView方法获取第一个条目时,传入任意一个条目的缓存
* 步骤:先判断条目是否有缓存,无缓存布局文件填充成一个View中,有直接调用。
* 目的:减少getView中的填充条目的操作,优化代码。
话不多说,上代码!希望对大家有用!
//在BaseAdapter中,系统调用此方法,获取要显示至ListView的View对象
@Override
public View getView(int position, View convertView, ViewGroup parent) {
Person p = personList.get(position);
View v = null;
//判断条目是否有缓存
if(convertView == null){
//把布局文件填充成一个View对象
v = View.inflate(MainActivity.this, R.layout.item_listview, null);
}
else{
v = convertView;
}
//通过资源id查找组件,注意调用的是View对象的findViewById
TextView name = (TextView) v.findViewById(R.id.name);
return v;
}
第二步:减少findViewById的次数
在adapter中创建一个ViewHolder类,在类中把条目的布局文件有什么组件,这里就定义什么属性。
具体步骤如下:
class ViewHolder{
//条目的布局文件中有什么组件,这里就定义什么属性
TextView title;
TextView detail;
TextView comment;
ImageView iv;
}
public View getView(int position, View convertView, ViewGroup parent) {
News news = newsList.get(position);
View v = null;
ViewHolder mHolder;
if(convertView == null){
//获取条目布局文件
v = View.inflate(MainActivity.this, R.layout.item_listview, null);
mHolder = new ViewHolder();
//把布局文件中所有组件的对象封装至ViewHolder对象中
mHolder.title = (TextView) v.findViewById(R.id.tv_title);
mHolder.detail = (TextView) v.findViewById(R.id.tv_detail);
mHolder.comment = (TextView) v.findViewById(R.id.tv_comment);
mHolder.iv = (SmartImageView) v.findViewById(R.id.iv);
//把ViewHolder对象封装至View对象中
v.setTag(mHolder);
}
else{
v = convertView;
mHolder = (ViewHolder) v.getTag();
}
//给三个文本框设置内容
mHolder.title.setText(news.getTitle());
mHolder.detail.setText(news.getDetail());
mHolder.comment.setText(news.getComment() + "条评论");
//给新闻图片imageview设置内容
mHolder.siv.setImageUrl(news.getImageUrl());
return v;
}