1,原理:
【1】滑动的时候回弹出GC。回收
【2】占用内容过多,原因是对象生成太快,对象生成太多。每显示一条,getView 的方法都会执行一次
2,解决方案:
【1】convertView 谷歌2010年提出的缓存view。
【2】getview 的进一步优化使用静态的ViewHolder 。 减少findViewById
3,实现代码:
【1】 创建static类ViewHolder
static class ViewHolder{
ImageView ivIcon;
TextView tvName;
TextView tvNum;
}
【2】convertView的复用
-
如果缓存convertView为空 生成新的view, 如果不是取出缓存view里的viewHolder对象
-
获取控件 存放到viewHolder对象里,然后把viewHolder对象 存到convertView里
-
获取图片后,要做处理,如果获取的图片为空,设置默认图片
private class ContactsAdapter extends BaseAdapter {
@Override
public int getCount() {
return mInfos.size();
}
@Override
public ContactsInfo getItem(int position) {
//返回是当前集合,当前条目的数据
return mInfos.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder viewHolder;
if (convertView == null) {
// 如果缓存convertView为空 生成新的view
convertView = View.inflate(getApplicationContext(),
R.layout.item_contacts, null);
// 获取控件 存放到viewHolder对象里
viewHolder = new ViewHolder();
viewHolder.ivIcon = (ImageView) convertView
.findViewById(R.id.iv_ic_icon);
viewHolder.tvName = (TextView) convertView
.findViewById(R.id.tv_ic_name);
viewHolder.tvNum = (TextView) convertView
.findViewById(R.id.tv_ic_num);
// 把viewHolder对象 存到convertView里
convertView.setTag(viewHolder);
} else {
// 取出缓存view里的viewHolder对象 viewHolder里有存好的控件
viewHolder = (ViewHolder) convertView.getTag();
}
// 控件赋值
ContactsInfo info = getItem(position);
viewHolder.tvName.setText(info.name);
viewHolder.tvNum.setText(info.number);
Bitmap bitmap = ContactsUtils.getContactsIcon(
getApplicationContext(), info.contactsId);
if (bitmap != null) {
// 设置头像
viewHolder.ivIcon.setImageBitmap(bitmap);
}else{
//没有头像 也要设置默认头像 否则会复用错误
viewHolder.ivIcon.setImageResource(R.drawable.ic_contact);
}
return convertView;
}