最近在做的项目中有个通讯录功能,里面实现了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 /