标注:本文为个人整理,仅做自己学习参考使用,请勿转载和转发
2018-06-19: 初稿。参考博主coder-pig
0. 引言
- 上一节主要介绍了ListView的简单使用属性
- BaseAdapter中比较重要的两个方法为,getCount()和getView(),界面上有多少列就会调用多少次getView,这个时候可以看到,每次都是新inflate的一个view,都要进行这个xml的解析,这样就会很浪费资源,在布局很复杂的时候就很麻烦
- 对BaseAdapter的优化,优化的两点有,复用convertView以及ViewHolder的重要组件,不用每次都findViewById
1. 复用ConvertView
- 界面上有多少个item,getView方法就会被调用多少次
@Override
public View getView(int position, View convertView, ViewGroup parent) {
convertView = LayoutInflater.from(mContext).inflate(R.layout.item_list_animal,parent,false);
ImageView img_icon = (ImageView) convertView.findViewById(R.id.img_icon);
TextView txt_aName = (TextView) convertView.findViewById(R.id.txt_aName);
TextView txt_aSpeak = (TextView) convertView.findViewById(R.id.txt_aSpeak);
img_icon.setBackgroundResource(mData.get(position).getaIcon());
txt_aName.setText(mData.get(position).getaName());
txt_aSpeak.setText(mData.get(position).getaSpeak());
return convertView;
}
- inflate()每次都要加载一次xml,其实这个convertView是系统提供给我们的可供服务用的View的缓存对象,可以臧家一个判断
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if(convertView == null){
convertView = LayoutInflater.from(mContext).inflate(R.layout.item_list_animal,parent,false);
}
ImageView img_icon = (ImageView) convertView.findViewById(R.id.img_icon);
TextView txt_aName = (TextView) convertView.findViewById(R.id.txt_aName);
TextView txt_aSpeak = (TextView) convertView.findViewById(R.id.txt_aSpeak);
img_icon.setBackgroundResource(mData.get(position).getaIcon());
txt_aName.setText(mData.get(position).getaName());
txt_aSpeak.setText(mData.get(position).getaSpeak());
return convertView;
}
这个版本还不是很优化,还是每次都需要findViewById
2. ViewHolder重用组件
- getView()会被调用多次,那么findViewbyId不一样得调用多次,而ListView一般都是一样的布局,还可以继续优化,所以需要自定义一个类进行优化
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder = null;
if(convertView == null){
convertView = LayoutInflater.from(mContext).inflate(R.layout.item_list_animal,parent,false);
holder = new ViewHolder();
holder.img_icon = (ImageView) convertView.findViewById(R.id.img_icon);
holder.txt_aName = (TextView) convertView.findViewById(R.id.txt_aName);
holder.txt_aSpeak = (TextView) convertView.findViewById(R.id.txt_aSpeak);
convertView.setTag(holder); //将Holder存储到convertView中
}else{
holder = (ViewHolder) convertView.getTag();
}
holder.img_icon.setBackgroundResource(mData.get(position).getaIcon());
holder.txt_aName.setText(mData.get(position).getaName());
holder.txt_aSpeak.setText(mData.get(position).getaSpeak());
return convertView;
}
static class ViewHolder{
ImageView img_icon;
TextView txt_aName;
TextView txt_aSpeak;
}
这个可以这么写,但是其中findViewById可以继承到ViewHolder中形成一个构造方法,然后单独将viewHolder抽出一个类,还有一个版本,更加详细的优化了BaseAdapter,先码住
网友评论