您的位置:首页 > 其它

提升ListView的运行效率和ListView的其他属性

2015-08-25 18:10 337 查看

提升ListView的运行效率

这里用到了两个参数 一个是convertView,另一个是ViewHolder,其实ViewHolder并不是一个参数。

public View getView(int position, View convertView, ViewGroup parent) {
//使用inflate方法来载入layout的xml
View view=mInflater.inflate(R.layout.activity_simplelist,null);
Student student=mData.get(position);
TextView textView_name= (TextView) view.findViewById(R.id.text_name);
TextView textView_age= (TextView) view.findViewById(R.id.text_age);
TextView textView_sex= (TextView) view.findViewById(R.id.text_sex);
TextView textView_hobby= (TextView) view.findViewById(R.id.text_hobby);
textView_name.setText(student.getName());
textView_age.setText(student.getAge());
textView_sex.setText(student.getSex());
textView_hobby.setText(student.getHobby());
return view;
}


在上边的代码中,每次都将布局重新加载了一遍,在ListView快速滚动的时候就会成为性能的瓶颈。Android提供了一个叫做Recycler(反复循环器)的构件,就是当ListView的Item从上方滚出屏幕视角之外,对应Item的View会被缓存到Recycler中,相应的会从下方生成一个Item,而此时调用的getView中的convertView参数就是滚出屏幕的Item的View。这时候就用到了convertView,convertView这个参数是用来将之前加载好的布局进行缓存,以便之后可以进行重用。除此之外,findViewById()方法会每次都去获取一次控件的实例。在这里可以用一个ViewHolder来对这部分的性能进行优化。

public View getView(final int position, View convertView, ViewGroup parent) {
//使用inflate方法来载入layout的xml
Student student = mData.get(position);
ViewHolder viewHolder;
if (convertView == null) {
convertView = mInflater.inflate(R.layout.activity_simplelist, null);
viewHolder=new ViewHolder();
viewHolder.textView_name = (TextView)convertView.findViewById(R.id.text_name);
viewHolder.textView_age = (TextView) convertView.findViewById(R.id.text_age);
viewHolder.textView_sex = (TextView) convertView.findViewById(R.id.text_sex);
viewHolder.textView_hobby = (TextView) convertView.findViewById(R.id.text_hobby);
viewHolder.imageView_photo= (ImageView) convertView.findViewById(R.id.imageview_photo);
viewHolder.checkBox= (CheckBox) convertView.findViewById(R.id.checkbox);
convertView.setTag(viewHolder);
}else{
viewHolder= (ViewHolder) convertView.getTag();
}
viewHolder.textView_name.setText(student.getName());
viewHolder.textView_age.setText(student.getAge());
viewHolder.textView_sex.setText(student.getSex());
viewHolder.textView_hobby.setText(student.getHobby());
viewHolder.imageView_photo.setImageResource(student.getImg());
return convertView;
}
class ViewHolder{
TextView textView_name;
TextView textView_age;
TextView textView_sex;
TextView textView_hobby;
ImageView imageView_photo;
CheckBox checkBox;
}


在上边的代码中,在getView()方法中进行了判断,如果conVertView为空,则用LayoutInflater去加载布局,如果不为空则直接对convertView进行重用。另外新增了一个内部类ViewHolder,用于对空间的实例进行缓存。当conVertView为空的时候,会创建一个ViewHolder对象,并将空间的实例都存放在ViewHolder中,然后调用setTag()方法,将ViewHolder对象存储在conVertView中,conVertView不为空的时候调用getTag()方法吧ViewHolder重新取出。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: