紧接着我把屏幕往下滑动了几下
通过log可以看出来,(我是用log打印的方式将convertView打印出来了。倒着看,最后的VE前边的那一串数字变代表着一个convertView。从中可以看出来每个convertView都不一样)。每一次的滑动。都会产生一个新的convertView,如果有好几千行的话。那么肯定会造成内存的紧张。也会造成滑动的卡顿。所以需要进行优化。
以下分别是进行优化和没有优化的代码
//下边是没有优化的代码,从代码中可以看出来。不光没出现一个新的Item需要创建一个conver而且还需要不停的findViewById.于是进行了下边的优化
@Override
public View getView( int position, View convertView, ViewGroup parent) {
// 加载 convertview
convertView = View. inflate( context , R.layout.item_main , null);
// 从 convertView 当中找到需要修改值的视图
TextView tv_item_word = (TextView) convertView.findViewById(R.id. tv_item_word);
TextView tv_item_name = (TextView) convertView.findViewById(R.id. tv_item_name);
// 然后给各个视图装配数据
tv_item_word.setText( data.get(position).getPinyin().substring( 0, 1));
tv_item_name .setText( data.get(position).getName());
Log.i( "TAG" , "有没有复用 convertView" +convertView);
return convertView;
}
优化之后的代码,其实代码并不多。注释的多了而已。更方便理解
//在这里声明一下 holder 就是为了在 else 里边用的时候不至于 是空的
ViewHolder holder;
// 通过加了 if (convertView != null) 这个判断条件。就省略了重复创建的浪费资源的情况
if (convertView == null) {
convertView = View.inflate ( context, R.layout.item_main , null);
holder = new ViewHolder();
holder. tv_item_name = (TextView) convertView.findViewById(R.id. tv_item_name);
holder. tv_item_word = (TextView) convertView.findViewById(R.id. tv_item_word);
//可以将 setTag 理解成为一种容器方法。先将初始化好的 holder 存储在 convertView 里边
convertView.setTag(holder);
} else {
//得到的 holder 是已经 findviewbyId 好了的。就不用再去 findviewbyid 了。也是一种优化
holder = (ViewHolder) convertView.getTag();
/*
加载数据的方法不能写在这里边。因为刚开始 convertVie==null 的时候是不执行的。也就是将
原来自己布局中的数据记载到了屏幕上
holder.tv_item_word.setText(data.get(position).getPinyin().substring(0, 1));
holder.tv_item_name.setText(data.get(position).getName());*/
}
// 装配数据
holder. tv_item_word.setText( data .get(position).getPinyin().substring( 0, 1));
holder.tv_item_name .setText( data.get(position).getName());
return convertView;
}
static class ViewHolder {
private TextView tv_item_word;
private TextView tv_item_name;
}
//如果装配数据的的代码写在了else{}里边就会产生下边的现象;