ListView 优化总结

来源:互联网 发布:林心如律师发声明知乎 编辑:程序博客网 时间:2024/05/30 05:00

前言:

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是有对应关心的,为什么会没有规律的价钱显示混乱没有想明白。?哪位朋友知道可以给予留言,谢谢。

0 0
原创粉丝点击