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