现在的位置: 首页 > 综合 > 正文

使用viewholder优化adapter

2017年11月17日 ⁄ 综合 ⁄ 共 934字 ⁄ 字号 评论关闭

ListView的BaseAdapter提供了如下方法:

public View getView(int position, View convertView, ViewGroup parent)

当ListView列表里的每一项显示时,都会调用Adapter的getView方法返回一个View。

例如:

public View getView(int position, View convertView, ViewGroup parent) {

  ViewHolder holder;

     if (convertView == null) {

          //创建新的view

      convertView = mInflater.inflate(R.layout.list_item, null);

      holder = new ViewHolder();

      holder.text = (TextView) convertView.findViewById(R.id.text);

      convertView.setTag(holder);

  } else {

           //使用缓存的view

      holder = (ViewHolder) convertView.getTag();

  }

  holder.text.setText("line" + position);

  return convertView;

}

 

private class ViewHolder {

  TextView text;

}

 

当向上滚动ListView时,getView()方法会被反复调用。getView()的第二个参数convertView是被缓存起来的List条目中的View对象。当ListView滑动的时候,getView可能会直接返回旧的convertView。这里使用了convertView和ViewHolder,可以充分利用缓存,避免反复创建View对象和TextView对象。

如果ListView的条目只有几个,这种技巧并不能带来多少性能的提升。但是如果条目有几百甚至几千个,使用这种技巧只会创建几个convertView和ViewHolder(取决于当前界面能够显示的条目数),性能的差别就非常非常大了。

 

 

 

抱歉!评论已关闭.