码迷,mamicode.com
首页 > 其他好文 > 详细

提高ListView的效率

时间:2015-12-18 18:49:25      阅读:122      评论:0      收藏:0      [点我收藏+]

标签:

按照普通的写法,如果ListView里面有比较多的东西的话,在加载每一个Item的时候,是非常非常卡的。具体表现就是滚动起来的时候会看见明显的卡顿。

关键还是处理自定义Adapter里面的getView函数,毕竟这个函数才是绘制Item的。

 

//观察getView函数,发现是有View convertView这个参数
public View getView(int position, View convertView, ViewGroup parent)

 




//如果convertView不为空的话,就是说这个Item的View已经是绘制过的了,我们直接view = convertView就好,不用再重新对View进行加工了。

if(convertView == null){

    view = LayoutInflater.from(getContext()).inflate(resouceID,null);

    //省略


}else{

    view = convertView;

    

}

 

进一步优化:

  可以自定义一个ViewHolder类,然后这个类的成员变量全是Item里面要用到的控件,用这个类来缓存Item的控件。用View.setTag(viewHolder)和View绑定,

如果convertView非空的时候,直接把里面的控件取出来就好了,不需要再次findViewByID一次。

  

  假设Item里面有一个TextView,一个Button。

 

class ViewHolder{

    TextView tv;

  Button bt;

}

 

  在getView里面:

  

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


    View  view;

    ViewHolder viewHolder;

  //没有绘制过的话
    if(convertView == null){

        view = LayoutInflater.from(getContext()).inflate(resouceID,null);

        viewHolder = new ViewHolder();
     
    //把所有控件弄进ViewHolder里面保存
        viewHolder.tv = (TextView)view.findViewById(R.id.itemtext);

     viewHolder.bt = (Button)view.findViewById(R.id.itembutton);

    //绑定在一起
         view.setTag(viewHolder);


    }else{
    
    //如果有的话就直接取出
        view = convertView;

    //经过了上一步,一个绘制过的View是肯定有一个ViewHolder的。
    //复制的是地址,只是方便修改
     viewHolder = (ViewHolder) view.getTag();

    }



    viewHolder.ty.setText("xx‘);
   viewHolder.bt.setText("xx");

  //或者其他代码

  //会根据view以及它绑定的viewHolder来绘制Item

    return view;

}

 

好了,这样优化过后,listView应该效率会很高了

 

提高ListView的效率

标签:

原文地址:http://www.cnblogs.com/wzben/p/5057611.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!