第一种以往的使用方式,移动listview每次都会创建view对象,消耗大量内存,代码如下:
lv.setAdapter(new BaseAdapter() {
@Override
public View getView(int position, View convertView, ViewGroup parent) {
convertView=getLayoutInflater().inflate(R.layout.item, null);
TextView view=(TextView) convertView.findViewById(R.id.text);
view.setText(array.get(position).toString());
return convertView;
}
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return position;
}
@Override
public Object getItem(int position) {
Out.println("getItem");
return array.get(position);
}
@Override
public int getCount() {
Out.println("getCount");
return array.size();
}
});
上面每次调用getView方法都是创建一个对象;
优化的listview适配器如下:
public class EntriesAdapter extends BaseAdapter {
private List<RosterEntry> entryList;
private LayoutInflater inflater;
@Override
public int getCount() {
return this.entryList.size();
}
public EntriesAdapter(Context context, List<RosterEntry> entryList) {
this.entryList = entryList;
this.inflater = LayoutInflater.from(context);
}
@Override
public Object getItem(int arg0) {
return this.entryList.get(arg0);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder viewHolder=null;
if (convertView == null) {
convertView = inflater.inflate(R.layout.entry, null);
viewHolder=new ViewHolder();
viewHolder.name=(TextView) convertView.findViewById(R.id.name);
viewHolder.status=(TextView) convertView.findViewById(R.id.status);
viewHolder.introduction=(TextView) convertView.findViewById(R.id.introduction);
convertView.setTag(viewHolder);
}else{
viewHolder=(ViewHolder) convertView.getTag();
}
viewHolder.name.setText(entryList.get(position).getName());
viewHolder.status.setText(MainChat.instance.getPresence(entryList.get(position)));
return convertView;
}
static class ViewHolder {
public TextView name;
public TextView status;
public TextView introduction;
}
}
上面的适配器创建了一个ViewHolder保存当前已保存的数据,而且调用getView的时候每次判断view对象是否存在,大大减少了创建的对象个数