您的位置:首页 > 其它

ListView的优化(二步骤)

2016-02-28 21:56 162 查看

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: