ListView 优化总结

前言:

listview的优化分为好多方面,后续会陆续补充。


一:显示优化

ViewHolder和convert view 的使用来优化性能,关于他们的介绍和理论应该非常多了,这里不再做解释,可以参考http://blog.csdn.net/huanongjingchao/article/details/42918869,感觉总结的非常不错。

通过优化经常遇到数据显示错位混乱的问题,造成数据显示混乱的情况有两中:

1:异步加载显示混乱(例如加载图片),不过第三方都已做处理,一般可以避免混乱。

2:同步加载显示混乱。(这种情况可能突然遇到会感觉不可思议,但是确实也会发生)

下面用代码来演示。

public class StarDocAdapter extends SunBaseAdapter<DocBean> {

    private DisplayImageOptions options;

    public StarDocAdapter(final Context context) {
        super(context);
        options = new DisplayImageOptions.Builder().showImageOnLoading(R.drawable.docno).cacheInMemory(true).cacheOnDisk(true)
                .imageScaleType(ImageScaleType.EXACTLY).displayer(new FadeInBitmapDisplayer(0)).imageScaleType(ImageScaleType.EXACTLY).build();

    }

    @Override
    public View getItemView(final int position, View convertView, final ViewGroup parent) {
        ViewHolder viewHolder;
        if (convertView == null) {
            convertView = mLayoutInflater.inflate(R.layout.adapter_star_doc, null, false);
            viewHolder = new ViewHolder(convertView);
            convertView.setTag(viewHolder);
        } else {
            viewHolder = (ViewHolder) convertView.getTag();
        }

        DocBean docBean = mList.get(position);
        try {
            viewHolder.mTvDocname.setText(docBean.doctorName);
            if ("1".equals(docBean.isClinic)) {
                viewHolder.mDutyClinicImgv.setVisibility(View.VISIBLE);
            } else {
                viewHolder.mDutyClinicImgv.setVisibility(View.GONE);
            }
            viewHolder.mTvOffice.setText(docBean.medicaldeptName);
            viewHolder.mTvProfessional.setText(docBean.professional);
            viewHolder.mTvHospitalname.setText(docBean.hospitalName);
            viewHolder.mTvGoodat.setText(docBean.doctorTags);
            viewHolder.mServerPersonNum.setText(docBean.serviceNum);


            if (!TextUtils.isEmpty(docBean.discountPrice)) {
                //同步加载显示错位也要避免。如果不设置显示,在列表上快速进行来回滑动,会发现大部分价钱显示的地方都隐藏了(没有规律),就是因为没有设置Visible所导致的。
                viewHolder.mDiscountpriceTv.setVisibility(View.VISIBLE);
                viewHolder.mPriceTv.setVisibility(View.VISIBLE);

                viewHolder.mDiscountpriceTv.setText("¥" + NumberUtil.format2Points(docBean.discountPrice) + PriceUtils.getPriceUnit(docBean.serviceUnit));
                if (docBean.discountPrice.equals(docBean.price)) {
                    viewHolder.mPriceTv.setVisibility(View.GONE);
                } else {
                    viewHolder.mPriceTv.setText("¥" + NumberUtil.format2Points(docBean.price) + PriceUtils.getPriceUnit(docBean.serviceUnit));
                    viewHolder.mPriceTv.getPaint().setFlags(Paint.STRIKE_THRU_TEXT_FLAG);
                }
            } else {
                LogUtil.outLog("hiden=="+position);
                viewHolder.mDiscountpriceTv.setVisibility(View.GONE);
                viewHolder.mPriceTv.setVisibility(View.GONE);
            }


            if ("0".equals(docBean.isTop)) {
                viewHolder.mIsTop.setVisibility(View.GONE);
            } else {
                viewHolder.mIsTop.setVisibility(View.VISIBLE);
            }
            viewHolder.mDoctorstar.setText(docBean.doctorStar + "星");
            if (!TextUtils.isEmpty(docBean.doctorPhoto)) {
                ImageLoader.getInstance().displayImage(docBean.doctorPhoto, viewHolder.mImgPhoto, options);
            }
        } catch (Exception e) {
            e.getMessage();
        }
        return convertView;
    }

    static class ViewHolder {
        @InjectView(R.id.img_photo)
        RoundImageView mImgPhoto;

        @InjectView(R.id.doctorstar)
        TextView mDoctorstar;

        @InjectView(R.id.tv_docname)
        TextView mTvDocname;

        @InjectView(R.id.duty_clinic_imgv)
        ImageView mDutyClinicImgv;

        @InjectView(R.id.tv_office)
        TextView mTvOffice;

        @InjectView(R.id.tv_professional)
        TextView mTvProfessional;

        @InjectView(R.id.tv_hospitalname)
        TextView mTvHospitalname;

        @InjectView(R.id.isTop)
        ImageView mIsTop;

        @InjectView(R.id.tv_goodat)
        TextView mTvGoodat;

        @InjectView(R.id.server_person_num)
        TextView mServerPersonNum;

        @InjectView(R.id.price_tv)
        TextView mPriceTv;

        @InjectView(R.id.discountprice_tv)
        TextView mDiscountpriceTv;

        ViewHolder(View view) {
            ButterKnife.inject(this, view);
        }
    }
}
问题:
   //同步加载显示错位也要避免。如果不设置显示,在列表上快速进行来回滑动,会发现大部分价钱显示的地方都隐藏了(没有规律),就是因为没有设置Visible所导致的。我一直理解的思想是:下一页的显示和convertview是有对应关心的,为什么会没有规律的价钱显示混乱没有想明白。?哪位朋友知道可以给予留言,谢谢。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值