• listview加载性能优化

    普通类
    • 支持
    • 批判
    • 提问
    • 解释
    • 补充
    • 删除
    • 关于ListView

    在android开发中Listview是一个很重要的组件,它以列表的形式根据数据的长自适应展示具体内容,用户可以自由的定义listview每一列的布局,但当listview有大量的数据需要加载的时候,会占据大量内存,影响性能,这时候就需要按需填充并重新使用view来减少对象的创建。

    加载数据时,每传入一个对象,调用一次getView()函数,但内存只会存储当前页面item的数据。ListView 针对List中每个item,要求 adapter “给我一个视图” (getView),一个新的视图被返回并显示,示意图如下:

    参考链接地址:http://www.cnblogs.com/xiaowenji/archive/2010/12/08/1900579.html

    • getView()的加载有3种方式

    (1)每一次都重新定义一个View载入布局,再加载数据;

    (2)当convertView不为空的时候直接重新使用convertView,减少不必要的View的创建,然后加载数据;

    (3)定义一个ViewHolder,将convetView的tag设置为ViewHolder,convertView不为空时重新使用。

    三种方式的的效率入下图:

      

    数据来源:http://www.2cto.com/kf/201108/101092.html

    • 加载性能优化

     

    目前使用的方法

    目前客户端采用的是第二种方式,代码如下:

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

        TextView lctitle;

        ImageView remarkUserImg;   

        if(convertView == null){       

             convertView = LayoutInflater.from(context).inflate(R.layout.lc_item, null);

        }    

    remarkUserImg = (ImageView) convertView.findViewById(R.id.remarkUserImg);       

     lctitle = (TextView) convertView.findViewById(R.id.lctitle);       

     lctitle.setText(mItems.get(position).get("lctitle"));    

    loadImage(mItems.get(position).get("remarkUserImg"), remarkUserImg);   

    return convertView;    }

    优化之后

    static class ViewHolder {

    TextView text;ImageView icon;}    

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

    TextView lctitle;    ImageView remarkUserImg;    ViewHolder holder;   

    if(convertView == null){       

    convertView = LayoutInflater.from(context).inflate(R.layout.lc_item, null);     

    holder = new ViewHolder();   

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

    remarkUserImg = (ImageView) convertView.findViewById(R.id.remarkUserImg);   

    convertView.setTag(holder);   

    } else {   

    holder = (ViewHolder) convertView.getTag(); 

     }   

    holder.text.setText(mItems.get(position).get("lctitle"));    //holder.icon.setImageBitmap(getBitMap(mItems.get(position).get("remarkUserImg")));//异步加载图片   

    remarkUserImg = (ImageView) convertView.findViewById(R.id.remarkUserImg);   

    loadImage(mItems.get(position).get("remarkUserImg"), remarkUserImg);   

    return convertView;    } 

    使用效果

    经测试,ListView加载耗时降低500ms~700ms

    • 标签:
    • 使用
    • listview
    • convertview
    • remarkuserimg
    • Android
    • textview
    • view
    • 数据
    • 优化
    • 加载
    • imageview
    • position
    • viewholder
  • 加入的知识群:
    学习元评论 (0条)

    评论为空
    聪明如你,不妨在这 发表你的看法与心得 ~



    登录之后可以发表学习元评论
      
暂无内容~~
顶部