您的位置:首页 > 其它

listview加载机能优化ViewHolder (转)

2012-08-30 15:50 260 查看

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: