在一级优化中我们只是对行布局进行了优化,在此基础上,我们还需要对控件的获取进行优化,即减少4000的次数,因此需要自定义一个ViewHolder类来针对行布局中的控件获取,来优化它。
一、使用ViewHolder进行优化
1.MyAdapter.java代码如下。
package com.oldtogether.adapterdemo2;
import java.util.List;
import java.util.Map;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;
public class MyAdapter3 extends BaseAdapter {
List<Map<String, Object>> list;
LayoutInflater Inflater;// 反射器
// 初始化反射器
public MyAdapter3(Context context) {
this.Inflater = LayoutInflater.from(context);
}
public void setList(List<Map<String, Object>> list) {
this.list = list;
}
@Override
public int getCount() {
// 获取ListView的行数
return list.size();
}
@Override
public Object getItem(int index) {
// 获得Item项的对象,其中的参数为此Item的下标,从零开始
return list.get(index);
}
@Override
public long getItemId(int id) {
// 获得ItemId
return id;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder=null;
//判断convertView是否为空,其来自getView方法的形参
if (convertView == null) {
//通过反射获得行布局对象
convertView = Inflater.inflate(R.layout.item, null);
holder=new ViewHolder();
// 获得控件对象,并作为ViewHolder的属性
holder.logo = (ImageView) convertView.findViewById(R.id.iv_logo);
holder.title = (TextView) convertView.findViewById(R.id.title);
holder.version = (TextView) convertView.findViewById(R.id.version);
holder.size = (TextView) convertView.findViewById(R.id.size);
//将ViewHolder和convertView关联起来
convertView.setTag(holder);
}else{
holder=(ViewHolder) convertView.getTag();
}
// 添加数据,注意需要强转
Map map = list.get(position);
holder.logo.setImageResource((int) map.get("logo"));
holder.title.setText((String) map.get("title"));
holder.version.setText((String) map.get("version"));
holder.size.setText((String) map.get("size"));
return convertView;
}
//自定义的ViewHolder类
public class ViewHolder{
ImageView logo;
TextView title;
TextView version;
TextView size;
}
}
2.实现代码的步骤
1.在MyAdapter中声明一个自定义的ViewHolder类,将控件属性设置为成员属性。
2.用if…else语句,将行布局和控件关联在一起,作为一个整体框架。
3.填充数据,就像填空题那样,将将资源加载到holder中。