您的位置:首页 > 移动开发 > Android开发

Android 之如何优化ListView

2014-12-09 18:13 417 查看

一:概要

众所周知,在开发过程中,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在滚动的过程中,不去加载网络图片,等滚动结束,在加载图片
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息