Google在Google I/O大会上,提到Android在UI优化方面可以从以下五个方面入手:
- Adapter优化
- 背景和图片优化
- 绘图优化
- 视图和布局优化
- 内存分配优化
1.Adapter优化
在ListView中,我们可以自定义Adapter,继承BaseAdapter,再重写相应的方法,
但需要特别注意,ListView的每一项视图加载都要经过getView这个方法,所以优化adapter
也就在此方法。
方案一:
1 @Override 2 public View getView(int position, View convertView, ViewGroup parent) { 3 // TODO Auto-generated method stub 4 5 convertView = mInflater.inflate(R.layout.img_listview_item, null); 6 holder.imgIv = (ImageView)convertView.findViewById(R.id.imageView1); 7 holder.itemTv = (TextView)convertView.findViewById(R.id.textView1); 8 holder.imgIv.setImageResource(R.drawable.icon); 9 holder.itemTv.setText(mDataItem[position]); 10 11 return convertView; 12 }
大家可以从方案一中看到,listview每显示一项,都要调用getView方法,对于每次重复创建convertView对象以及findViewById
方法,都会影响性能,如果ListView有显示N多项,可想而知,资源的消耗有多大!
方案二:
1 @Override 2 public View getView(int position, View convertView, ViewGroup parent) { 3 // TODO Auto-generated method stub 4 5 ViewHolder holder; 6 if(convertView == null){ 7 holder = new ViewHolder(); 8 convertView = mInflater.inflate(R.layout.img_listview_item, null); 9 holder.imgIv = (ImageView)convertView.findViewById(R.id.imageView1); 10 holder.itemTv = (TextView)convertView.findViewById(R.id.textView1); 11 convertView.setTag(holder); 12 13 }else{ 14 15 holder = (ViewHolder)convertView.getTag(); 16 17 } 18 19 holder.imgIv.setImageResource(R.drawable.icon); 20 holder.itemTv.setText(mDataItem[position]); 21 22 return convertView; 23 } 24 25 26 class ViewHolder{ 27 public ImageView imgIv; 28 public TextView itemTv; 29 }
从方案二中,我们看到,当convertView为null的时候才去创建convertView以及获取相应的控件对象,在最下面,还创建一个ViewHolder类,这个类是干嘛用的呢?
它是保存每项ListView视图里的控件对象,达到缓存控件对象,而不用每次都用findViewById()去获取,节省资源,这是一个优化细节。
注意:
在界面初始后,第一次可见的视图项,这个要具体ListView可最多显示几项,在这几项初始时,都会调用
if(convertView == null){
最初几项调用...
}
但拉动ListView显示下面的数据时,那接下来就调用
}else{
holder = (ViewHolder)convertView.getTag();
}
这部分啦!