重用ConvertView
一般我们在重写BaseAdapter里的getView()中,有多少条数据就要inflate多少次布局文件,比较浪费资源。未优化前的代码
@Override
public View getView(int position, View convertView, ViewGroup parent) {
convertView = LayoutInflater.from(mContext).inflate(R.layout.item_demo,parent,false);
TextView textView = convertView.findViewById(R.id.tv_item);
textView.setText(list.get(position));
return convertView;
}
实际上,convertView是系统提供给我们的可复用的View的缓存对象,只需加一个判断即可实现复用。
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView ==null){
convertView = LayoutInflater.from(mContext).inflate(R.layout.item_demo,parent,false);
}
TextView textView = convertView.findViewById(R.id.tv_item);
textView.setText(list.get(position));
return convertView;
}
ViewHolder重用组件
getView()会被调用多次,则findViewById也一样会被调用多次。未修改前
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView ==null){
convertView = LayoutInflater.from(mContext).inflate(R.layout.item_demo,parent,false);
}
TextView textView = convertView.findViewById(R.id.tv_item);
textView.setText(list.get(position));
return convertView;
}
可以自定义ViewHolder来绑定控件
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView ==null){
convertView = LayoutInflater.from(mContext).inflate(R.layout.item_demo,parent,false);
viewHolder = new ViewHolder();
viewHolder.textView = convertView.findViewById(R.id.tv_item);
convertView.setTag(viewHolder); //将viewHolder存储到convertView中
}else {
viewHolder = (ViewHolder) convertView.getTag();
}
viewHolder.textView.setText(list.get(position));
return convertView;
}
static class ViewHolder{
TextView textView;
}
}