Android 之如何优化ListView

一:概要

众所周知,在开发过程中,ListView的优化是比较重要的那么,如何去优化呢?

如何ListView的提升效率,好像有很多,其实最主要的就是在于adapter中getView方法的优化,那么如何使的getView优化呢?

第一点:     

在getView() 中重用了convertView,很大程度上的减少了内存的消耗。通过判断convertView是否为null,是的话就需
要产生一个视图出来,然后给这个视图数据,最后将这个视图返回给底层,呈献给用户。 

第二点:

比如:listview 屏幕显示10条数据,当用户滑动listview的时候,第11条数据出现的时候,第一条数据就会被android本身提供

的  Recycler,将这条item(View)放进RecycleBin(回收站)中,然后显示新视图的时候,从RecycleBin中重复用这个View。就

不会造成每次都要去创建新的View,而节约了大量的资源。

第三点:

自身写一个ViewHolder 类,这个ViewHolder,用来标识view中一些控件,方便进行一些事件相应操作的设置,这样就 不用每次 getView() 的View只要找一次控件就好了,不用每次都去寻找。 代码表示如下:
<span style="font-family:Microsoft YaHei;font-size:14px;">package com.x1.tools.adapter;

import java.util.ArrayList;
import java.util.List;

import android.annotation.SuppressLint;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;

import com.x1.tools.Config;
import com.x1.tools.vo.Coupon;
import com.x1.ui.R;

/***
 * 优惠卷的适配器
 * 
 * @author zengtao 2015年3月31日 上午9:46:08
 */
@SuppressLint({ "InflateParams", "SimpleDateFormat" })
public class CouponAdapter extends BaseAdapter {
	private List<Coupon> list = new ArrayList<Coupon>();
	private Context context;
	private int[] couponImage = { R.drawable.coupon_image_1,
			R.drawable.coupon_image_2 };
	private int[] couponRight = { R.drawable.coupon_rightimage };

	public CouponAdapter(Context context) {
		this.context = context;
	}

	@Override
	public int getCount() {
		return list.size();
	}

	@Override
	public Coupon getItem(int position) {
		return list.get(position);
	}

	@Override
	public long getItemId(int position) {
		return position;
	}

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

		if (convertView == null) {
			convertView = LayoutInflater.from(context).inflate(
					R.layout.coupon_item_list, null);
			ViewHolder vh = new ViewHolder(convertView);
			convertView.setTag(vh);
		}
		ViewHolder viewHolder = (ViewHolder) convertView.getTag();
		viewHolder.fillView(getItem(position));
		return convertView;
	}

	/**
	 * 内部类实现查找控件和数据的显示,这样可以实现布局和控件只加载一次
	 * 
	 * @author zengtao 2015年3月31日 下午1:34:00
	 */
	class ViewHolder {
		public ImageView mCouponImage, mCouponRight;
		public TextView mCouponMoney, mCouponDisplayMessage, mCouponTime;

		public ViewHolder(View view) {
			mCouponImage = (ImageView) view.findViewById(R.id.coupon_icon);
			mCouponRight = (ImageView) view.findViewById(R.id.coupon_righticon);
			mCouponMoney = (TextView) view.findViewById(R.id.coupon_money);
			mCouponDisplayMessage = (TextView) view
					.findViewById(R.id.coupon_message);
			mCouponTime = (TextView) view
					.findViewById(R.id.coupon_stime_endtime);
		}

		public void fillView(Coupon coupon) {
			Coupon cou = coupon;
			if (cou.getCoupon_bgimage() == 1) {
				mCouponImage.setImageResource(couponImage[0]);
			} else if (cou.getCoupon_bgimage() == 0) {
				mCouponImage.setImageResource(couponImage[1]);
			}
			
			if (cou.getCoupon_iconimage() == 0) {
				mCouponRight.setImageResource(couponRight[0]);
			}

			mCouponMoney.setText(cou.getCoupon_money() + "元");
			mCouponDisplayMessage.setText(cou.getCoupon_access());
			mCouponTime.setText(Config.formatDate(cou.getCoupon_begintime())
					+ "至" + Config.formatDate(cou.getCoupon_endtime()));
		}
	}

	// 添加数据
	public void addAll(List<Coupon> list) {
		this.list.addAll(list);
		notifyDataSetChanged();
	}

	// 清空
	public void clear() {
		list.clear();
		notifyDataSetChanged();
	}
}
</span>

第四点:

分页加载数据,这样获取的数据会比较少,对网络依赖较少,可以很快完成,加载速度很快

第五点:

对ListView做滚动事件处理,当ListView在滚动的过程中,不去加载网络图片,等滚动结束,在加载图片


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值