在android开发中经常会用到listView以及GridView等控件,此类控件在数据设置方面一般都是通过Adapter来实现的,当数据量小的时候不会涉及到时间的优化,但是当一些数据量比较大并且item控件自定义比较复杂的情况下就需要考虑性能的优化,虽然现如今的android手机运行内存都比较大,但是作为一个有节操、有修养的程序员,我们不仅仅是需要实现功能,同时也需要考虑性能等等的问题,这样有助于编写出优秀的代码,并且对于我们以后的提高很有帮助。。。。。。。那么在listview中如何优化呢?
在对于listView 中的优化我们分为两部分:
对于listView中item的重用进行优化
对于item中的子控件的获取进行时间上的优化
首先我们先来看看在通常情况下,对listview赋值时的Adapter的编写方法
效率最慢,内存消耗最多
View view =.inflate(R.layout.)ImageView imageView = (ImageView) view.findViewById(R.id.)TextView title = (TextView) view.findViewById(R.id.)TextView content = (TextView) view.findViewById(R.id.)itemBean itemBean = .get(position)imageView.setImageResource(itemBean.getImageRec())title.setText(itemBean.getTitle())content.setText(itemBean.getContent())view
效率慢,内存消耗较少
if (convertView == null) {
convertView = inflater.inflate(R.layout.item, null);
}
ImageView image = (ImageView) convertView.findViewById(R.id.image);
TextView title = (TextView) convertView.findViewById(R.id.title);
TextView content = (TextView) convertView.findViewById(R.id.centent);
itemBean itembean = itemBeanList.get(position);
image.setImageResource(itembean.getImageRec());
title.setText(itembean.getTitle());
content.setText(itembean.getContent());
return convertView;
效率最快,内存消耗最少
ViewHoler viewholder;
if (convertView==null){
convertView = inflater.inflate(R.layout.item,null);
viewholder = new ViewHoler();
viewholder.image = (ImageView) convertView.findViewById(R.id.image);
viewholder.title = (TextView) convertView.findViewById(R.id.title);
viewholder.content =(TextView) convertView.findViewById(R.id.centent);
convertView.setTag(viewholder);
}else {
viewholder = (ViewHoler) convertView.getTag();
}
itemBean itembean = itemBeanList.get(position);
viewholder.image.setImageResource(itembean.getImageRec());
viewholder.title.setText(itembean.getTitle());
viewholder.content.setText(itembean.getContent());
return convertView;
class ViewHoler{
public ImageView image;
public TextView title;
public TextView content;
}
对于以上三种方式,建议在开发中尽量使用第三种方式,那么为什么这样建议,通过以上代码我们并不能直观的判断出那种方式效率最高,那种方式最优化,下面通过将此三种方式运行在同平台下,同数据量的同时使用的时间打印出来,通过时间我们可以非常直观的看出那种效率最高
打印每种代码在相同平台以及相同的数据量的情况下执行的时间:
long start = System.nanoTime();
/*
具体的代码执行,及以上的三种方式的代码
*/
long end = System.nanoTime();
long time = end - start;
userTime += time;
Log.d("time", String.valueOf(userTime));
通过打印时间,并且对时间的比较
3 < 2 <1
所以方法3 是最优化的方式