listview加载机能优化ViewHolder (转)

listview加载机能优化ViewHolder (转)
2012-8-30

 

在android开辟中Listview是一个很首要的组件,它以列表的情势按照数据的长自适应显现具体内容,用户可以自由的定义listview每一列的布局,但当listview有多量的数据须要加载的时辰,会占领多量内存,影响机能,这时辰就须要按需填充并从头应用view来削减对象的创建。

ListView加载数据都是在public View getView(int position, View convertView, ViewGroup parent) {}办法中进行的(要自定义listview都须要重写listadapter:如BaseAdapter,SimpleAdapter,CursorAdapter的等的getvView办法),优化listview的加载速度就要让convertView匹配列表类型,并最大程度上的从头应用convertView。

getview的加载办法一般有以下三各种体式格式:

最慢的加载体式格式是每一次都从头定义一个View载入布局,再加载数据

public View getView(int position, View convertView, ViewGroup parent) { 
  View item = mInflater.inflate(R.layout.list_item_icon_text, null); 
  ((TextView) item.findViewById(R.id.text)).setText(DATA[position]); 
  ((ImageView) item.findViewById(R.id.icon)).setImageBitmap( 
  (position & 1) == 1 ? mIcon1 : mIcon2); 
  return item; 
} 


正确的加载体式格式是当convertView不为空的时辰直接从头应用convertView从而削减了很多不须要的View的创建,然后加载数据

public View getView(int position, View convertView, ViewGroup parent) { 
if (convertView == null) { 
  convertView = mInflater.inflate(R.layout.item, parent,false); 
  } 
   ((TextView) convertView.findViewById(R.id.text)).setText(DATA[position]); 
   ((ImageView) convertView.findViewById(R.id.icon)).setImageBitmap( 
   (position & 1) == 1 ? mIcon1 : mIcon2); 
  return convertView; 
} 



最快的体式格式是定义一个ViewHolder,将convetView的tag设置为ViewHolder,不为空时从头应用即可

static class ViewHolder { 
  TextView text; 
  ImageView icon; 
} 

public View getView(int position,View  convertView,ViewGroup parent) { 
  ViewHolder holder; 
  if (convertView == null) { 
    convertView = mInflater.inflate(R.layout.list_item_icon_text,parent,false); 
    holder = new ViewHolder(); 
    holder.text = (TextView) convertView.findViewById(R.id.text); 
    holder.icon = (ImageView) convertView.findViewById(R.id.icon); 
    convertView.setTag(holder); 
  } else { 
      holder = (ViewHolder) convertView.getTag(); 
     } 
  holder.text.setText(DATA[position]); 
  holder.icon.setImageBitmap((position & 1) == 1 ? mIcon1 : mIcon2); 
  return convertView; 
} 


三种体式格式加载效力对比如下图所示:
 
    申明:上述三个例子代码摘自google 2010 I/O大会



当处理惩罚一些耗时的资料加载的时辰须要做到以下几点,以使你的加载更快更腻滑:

1.   适配器在界面主线程中进行批改

2.   可以在任何处所获取数据但应当在别的一个处所恳求数据

3.   在主界面的线程中提交适配器的变更并调用notifyDataSetChanged()办法
转自:
http://blog.csdn.net/jacman/article/details/7087995

posted on 2012-08-30 15:50  〃ωǒ系﹄条噚氺dē魚ぐ  阅读(209)  评论(0编辑  收藏  举报

导航