44黑名单界面显示&&ListView的优化

第一步:使用convertView.(减少内存中view对象创建的个数)

convertView的定义:The old view to reuse,使用它首先得判断他是否为空。

第一屏的时候convertView为null,view有其自身的值,那么滚动到第二屏的时候,convertView在第二屏的第一个值会使用view在第一屏的第一个值。

View view;
		if (convertView == null) {
			 view = View.inflate(context, R.layout.list_item_callsms, null);
		}else {
			view = convertView;
		}

第二步:(减少子孩子查询的次数)使用ViewHolder

Hold View Objects in a View Holder


Your code might call findViewById() frequently during the scrolling of ListView, which can slow down performance. Even when the Adapter returns an inflated view for recycling, you still need to look up the elements and update them. A way around repeated use of findViewById() is to use the "view holder" design pattern.

ViewHolder object stores each of the component views inside the tag field of the Layout, so you can immediately access them without the need to look them up repeatedly. First, you need to create a class to hold your exact set of views. For example:

static class ViewHolder {
  TextView text;
  TextView timestamp;
  ImageView icon;
  ProgressBar progress;
  int position;
}

Then populate the ViewHolder and store it inside the layout.

ViewHolder holder = new ViewHolder();
holder.icon = (ImageView) convertView.findViewById(R.id.listitem_image);
holder.text = (TextView) convertView.findViewById(R.id.listitem_text);
holder.timestamp = (TextView) convertView.findViewById(R.id.listitem_timestamp);
holder.progress = (ProgressBar) convertView.findViewById(R.id.progress_spinner);
convertView.setTag(holder);

Now you can easily access each view without the need for the look-up, saving valuable processor cycles.

我们的代码:

package com.ustc.mobilemanager.adapter;

import java.util.List;

import com.ustc.mobilemanager.R;
import com.ustc.mobilemanager.db.BlackNumberDao;
import com.ustc.mobilemanager.domain.BlackNumberInfo;

import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;

public class CallSmsSafeAdapter extends BaseAdapter {

	private List<BlackNumberInfo> infos;

	private BlackNumberDao dao;

	private Context context;

	public CallSmsSafeAdapter(Context context) {

		this.context = context;
		dao = new BlackNumberDao(context);
		infos = dao.findAll();
	}

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

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

		ViewHolder viewHolder;

		if (convertView == null) {
			view = View.inflate(context, R.layout.list_item_callsms, null);

			viewHolder = new ViewHolder();

			viewHolder.tv_black_number = (TextView) view
					.findViewById(R.id.tv_black_number);
			viewHolder.tv_black_mode = (TextView) view
					.findViewById(R.id.tv_black_mode);

			view.setTag(viewHolder);

		} else {
			view = convertView;

			viewHolder = (ViewHolder) view.getTag();

		}

		viewHolder.tv_black_number.setText(infos.get(position).getNumber());

		String mode = infos.get(position).getMode();

		if ("1".equals(mode)) {
			viewHolder.tv_black_mode.setText("电话拦截");

		} else if ("2".equals(mode)) {
			viewHolder.tv_black_mode.setText("短信拦截");
		} else {
			viewHolder.tv_black_mode.setText("全部拦截");
		}

		return view;
	}

	@Override
	public Object getItem(int position) {
		return null;
	}

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

	static class ViewHolder {
		TextView tv_black_number;
		TextView tv_black_mode;

	}

}


ViewHoler加上static,使其成为静态类,字节码只会加载进来一次。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值