Android 实现ListView的A-Z字母排序及过滤搜索功能(通讯录)

本文介绍了如何在Android项目中实现通讯录功能,利用ListView进行A-Z字母排序,并实现了对汉字姓名、拼音姓名、手机号码的搜索过滤。详细讲解了联系人实体类的设计以及关键方法的使用,如getSectionForPosition和getPositionForSection,用于根据字母首字母进行定位和查找。
摘要由CSDN通过智能技术生成

   最近在做的项目中有个通讯录功能,里面实现了ListView的A-Z排序以及对通讯录中的联系人按 汉字姓名、拼音姓名、手机号码进行搜索(过滤),详细过程如下:

   1、联系人实体类,通讯录部分用到了name(联系人姓名)、pinyin(联系人姓名拼音)、header(联系人拼音首字母),具体如下:

package com.bean.note;

public class PersonBean {

	private String id;
	private String name;
	private String region;
	private String department;
	private String position;
	private String isOften;
	private String permission;
	private boolean ischeck;

	private String pinyin;
	private String header;

	private String email;
	private String mobilePhone;
	private String telephone;
	private String sex;
	private String groupId;
	private String headImagePath;

	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getRegion() {
		return region;
	}

	public void setRegion(String region) {
		this.region = region;
	}

	public String getDepartment() {
		return department;
	}

	public void setDepartment(String department) {
		this.department = department;
	}

	public String getPosition() {
		return position;
	}

	public void setPosition(String position) {
		this.position = position;
	}

	public String getPermission() {
		return permission;
	}

	public void setPermission(String permission) {
		this.permission = permission;
	}

	public String getIsOften() {
		return isOften;
	}

	public void setIsOften(String isOften) {
		this.isOften = isOften;
	}

	public String getPinyin() {
		return pinyin;
	}

	public void setPinyin(String pinyin) {
		this.pinyin = pinyin;
	}

	public String getHeader() {
		return header;
	}

	public void setHeader(String header) {
		this.header = header;
	}

	public String getEmail() {
		return email;
	}

	public void setEmail(String email) {
		this.email = email;
	}

	public String getMobilePhone() {
		return mobilePhone;
	}

	public void setMobilePhone(String mobilePhone) {
		this.mobilePhone = mobilePhone;
	}

	public String getTelephone() {
		return telephone;
	}

	public void setTelephone(String telephone) {
		this.telephone = telephone;
	}

	public String getSex() {
		return sex;
	}

	public void setSex(String sex) {
		this.sex = sex;
	}

	public String getGroupId() {
		return groupId;
	}

	public void setGroupId(String groupId) {
		this.groupId = groupId;
	}

	public String getHeadImagePath() {
		return headImagePath;
	}

	public void setHeadImagePath(String headImagePath) {
		this.headImagePath = headImagePath;
	}

	public boolean getIscheck() {
		return ischeck;
	}

	public void setIscheck(boolean ischeck) {
		this.ischeck = ischeck;
	}

}
 2.Sidebar类就是ListVIew右侧显示的A-Z字母索引的VIew,我们需要使用setHeaderTextAndscroll(MotionEvent event)来实现当按下右侧索引字母时在屏幕中间显示所按下的字母及listVIew定位到我们所按下字母的位置,具体代码如下:

package com.contactlist;

import com.adapter.contact.ContactAdapter;
import com.l2cplat.l2cplat.R;
import com.util.DensityUtil;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Paint.Align;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import android.widget.ListView;
import android.widget.TextView;

public class Sidebar extends View {

	private Paint paint;
	private TextView header;
	private float height;
	private ListView myListView;
	private Context context;

	private String[] sections = new String[] { "A", "B", "C", "D", "E", "F",
			"G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S",
			"T", "U", "V", "W", "X", "Y", "Z", "#" };

	public void setListView(ListView listView) {
		myListView = listView;
	}

	public Sidebar(Context context, AttributeSet attrs) {
		super(context, attrs);
		this.context = context;
		init();
	}

	private void init() {
		paint = new Paint(Paint.ANTI_ALIAS_FLAG);
		paint.setColor(Color.DKGRAY);// 设置绘制的颜色
		paint.setTextAlign(Align.CENTER);// 设置绘制文子的对齐方式
		paint.setTextSize(DensityUtil.dip2px(context, 15));// 设置绘制文字的字号大小
	}

	@Override
	protected void onDraw(Canvas canvas) {
		super.onDraw(canvas);
		float center = getWidth() / 2;
		height = getHeight() / sections.length;
		for (int i = sections.length - 1; i > -1; i--) {
			canvas.drawText(sections[i], center, height * (i + 1), paint);
			// paint.reset();// 重置画笔
		}
	}

	private int sectionForPoint(float y) {
		int index = (int) (y /
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值