ListView的优化问
重复使用convertView
在getView方法中输出view对象,检测每一个view对象的地址。
System.out.println("position ----->" + view);
不停地滑动,每次的值都不一样,这就说明每次滑动都会创建不同的对象,这样也会造成内存溢出的隐患。解决上面的问题需要使用getView方法的convertView来进行优化
convertView(转化视图){将将要隐藏的视图转化为将要显示的视图}如果列表项退出频幕的时候不是销毁对象而是将其转化为将要显示列表项的对象只是将里面的值改变,从而达到资源重复利用。提高节省系统空间的开支。
做法很简单只是在getView方法之中加上一句判断:
if (convertView == null) { // 表示屏幕上没有可以重复利用的对象,若为空则创建一个对象
convertView = getLayoutInflater().inflate(R.layout.main5_item,
null);
}
conVertView == null;表示屏幕上没有可以重复利用的对象,加判断若某一个Item被隐 藏,
则此时会有可以重复利用的对象(被隐藏的Item对应的对象)则重复使用这个对象即可,否则重新创建
代码如下:
使用ViewHolder提高在容器中的查找组件效率:
在每次创建的时候都要使用findViewById()方法从布局文件中进行组件的查找,如果布局文件复杂将会非常耗时,使应用程序的性能降低。因此引入ViewHolder
将ConvertView的Tag设置为ViewHolder,不为空(有可以使用的)时重新使用。
ViewHolder 是将需要缓存的View封装好,conVertView的setTag()将这些(组件对象)缓存起来供下次使用,这样就不必要重复进行查找。从而提高了效率。
代码如下:
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder vh = null;
if (convertView == null) { // 表示屏幕上没有可以重复利用的对象,若为空则创建一个对象
convertView = getLayoutInflater().inflate(R.layout.main5_item,
null);
vh = new ViewHolder();
vh.iv = (ImageView) convertView.findViewById(R.id.imageView1);
vh.tv = (TextView) convertView.findViewById(R.id.textView5);
convertView.setTag(vh); //将对象暂存
} else {
vh = (ViewHolder) convertView.getTag(); //取出暂存的对象不必重复创建这样只创建一次
}
vh.iv.setImageResource(images[position]);
vh.tv.setText(names[position]);
return convertView;
}
}
static class ViewHolder { // 自定义类保存两个组件
ImageView iv;
TextView tv;
}
}
这样就完成了ListView使用的优化问题。