问题
综上:
1、因为不用每次调用getView的时候都inflate一个view出来,所以从速度上更快,并且内存也得到了优化。
2、由于通过ViewHolder保存了对控件的引用,不要每次都去调用findviewbyId(),也更加的方便快捷
- 当列表中有成千上万条记录的时候,如果每一条记录都去new 一个view的话,就会发生oom
解决问题:通过view的复用来解决这一问题,用户之需要关心在屏幕之内看得见的部分就可以了,所以不在屏幕中的部分可以回收利用。
@Override
public View getView(int position, View convertView, ViewGroup parent) {
Log.d(TAG, "position=" + position + ",convertView=" + convertView);
ViewHolder viewHolder = null;// 保存控件的引用,不用每次都调用findviewById(...)
if (convertView == null) {// 只有当convertView为空的时候,才去创建
convertView = LayoutInflater.from(mContext).inflate(
R.layout.list_item, null);// 这个过程相当耗时间
viewHolder = new ViewHolder();
viewHolder.mTextView = (TextView) convertView
.findViewById(R.id.tv_tips);
viewHolder.mImageView = (ImageView) convertView
.findViewById(R.id.iv_image);
convertView.setTag(viewHolder);
} else {// 利用回收回来的view
viewHolder = (ViewHolder) convertView.getTag();
}
viewHolder.mTextView.setText("-----" + position);
return convertView;
}
class ViewHolder {
TextView mTextView;
ImageView mImageView;
}
综上:
1、因为不用每次调用getView的时候都inflate一个view出来,所以从速度上更快,并且内存也得到了优化。
2、由于通过ViewHolder保存了对控件的引用,不要每次都去调用findviewbyId(),也更加的方便快捷