Android Listview 优化

1,原理:

【1】滑动的时候回弹出GC。回收

【2】占用内容过多,原因是对象生成太快,对象生成太多。每显示一条,getView 的方法都会执行一次

 

2,解决方案:

【1】convertView 谷歌2010年提出的缓存view。

 

【2】getview 的进一步优化使用静态的ViewHolder 。 减少findViewById

 

3,实现代码:

【1】 创建static类ViewHolder

static class ViewHolder{

   ImageView ivIcon;

   TextView tvName;

   TextView tvNum;

}

 

【2】convertView的复用

  • 如果缓存convertView为空 生成新的view, 如果不是取出缓存view里的viewHolder对象

  • 获取控件 存放到viewHolder对象里,然后把viewHolder对象 存到convertView里

  • 获取图片后,要做处理,如果获取的图片为空,设置默认图片

private class ContactsAdapter extends BaseAdapter {

    @Override

    public int getCount() {

        return mInfos.size();

    }



    @Override

    public ContactsInfo getItem(int position) {

        //返回是当前集合,当前条目的数据

        return mInfos.get(position);

    }



    @Override

    public long getItemId(int position) {

        return position;

    }



    @Override

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

       ViewHolder viewHolder;

        if (convertView == null) {

        // 如果缓存convertView为空 生成新的view

        convertView = View.inflate(getApplicationContext(),

                R.layout.item_contacts, null);

        // 获取控件 存放到viewHolder对象里

        viewHolder = new ViewHolder();

        viewHolder.ivIcon = (ImageView) convertView

                .findViewById(R.id.iv_ic_icon);

        viewHolder.tvName = (TextView) convertView

                .findViewById(R.id.tv_ic_name);

        viewHolder.tvNum = (TextView) convertView

                .findViewById(R.id.tv_ic_num);

        // 把viewHolder对象 存到convertView里

        convertView.setTag(viewHolder);

    } else {

        // 取出缓存view里的viewHolder对象 viewHolder里有存好的控件

        viewHolder = (ViewHolder) convertView.getTag();

    }

    // 控件赋值

    ContactsInfo info = getItem(position);

    viewHolder.tvName.setText(info.name);

    viewHolder.tvNum.setText(info.number);



    Bitmap bitmap = ContactsUtils.getContactsIcon(

            getApplicationContext(), info.contactsId);

    if (bitmap != null) {

        // 设置头像

        viewHolder.ivIcon.setImageBitmap(bitmap);

    }else{

        //没有头像 也要设置默认头像  否则会复用错误

        viewHolder.ivIcon.setImageResource(R.drawable.ic_contact);

    }

    return convertView;

}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

兴帅_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值