之前自己写的通讯录模糊匹配,因为需求改过,代码有过修改,所以逻辑可能比较乱,不过已经实现了模糊匹配。包括汉字,拼音,大小写匹配等。需要的同学可以参考下
实现思路:在EditText中添加监听 et_search.addTextChangedListener(new EditChangeListener(ConnectsActivity.this, connectsList, connectsQueryList, adapter));
EditChangeListener是自定义的,继承自TextWatcher,用于监听EditText数据变化。
connectsList是通讯录数据集合,connectsQueryList是查询后的符合条件的数据集合,adapter是用于显示通讯录数据的适配器。
我在代码中添加了注释
具体代码如下:(这里只粘出了TextWatcher的onTextChanged中的代码,主要逻辑都在这个方法中)
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
//获取搜索框输入的内容
SpannableStringBuilder builder = (SpannableStringBuilder) s;
//这里是将输入的字母全部转换为大写字母
StringBuffer sb = new StringBuffer();
Pattern p = Pattern.compile("[a-zA-Z]");
Matcher m;
if (input != null && input.length() != 0) {
m = p.matcher(input.substring(0, 1));
if (m.matches()) {
if (input != null) {
for (int i = 0; i < input.length(); i++) {
char c = input.charAt(i);
if (Character.isUpperCase(c)) {
sb.append(c);
} else if (Character.isLowerCase(c)) {
sb.append(Character.toUpperCase(c));
}
}
}
input = sb.toString();
}
}
//因为是时时匹配,所以需要将查询后的数据集合清空
connectsQueryList.clear();
//BaseConnects是定义的数据对象,存放姓名,姓名转化后的拼音(默认已经全部转化为大写拼音),电话等信息
for (BaseConnects haoHan : connectsList) {
int startIndex = 0;
if (haoHan.getPhone1()!=null){
//这里判断拼音、姓名、电话是否包含输入的信息
if (haoHan.pinyin.contains(input) || haoHan.getAccountName().contains(input)||haoHan.getPhone1().contains(input)) {
//这里去除重复数据
if (!connectsQueryList.contains(haoHan)) {
connectsQueryList.add(haoHan);
}
}
}else {
if (haoHan.pinyin.contains(input) || haoHan.getAccountName().contains(input)||haoHan.phone.contains(input)) {
if (!connectsQueryList.contains(haoHan)) {
connectsQueryList.add(haoHan);
}
}
}
//下面是模糊匹配核心代码
//首先将输入的字符串查分成字符
for (int i = 0; i < input.toCharArray().length; i++) {
char c = input.toCharArray()[i];
String str = haoHan.pinyin.substring(startIndex, haoHan.pinyin.length());
//判断拼音中是否包含该字符
if (str.contains(String.valueOf(c))) {
for (int i1 = 0; i1 < str.toCharArray().length; i1++) {
char c1 = str.toCharArray()[i1];
if (i1 != str.toCharArray().length) {
if (c1 != c) {
startIndex++;
} else {
//如果字符匹配则跳出该轮循环,进入下一轮循环
if (i == input.toCharArray().length - 1) {
if (!connectsQueryList.contains(haoHan)) {
connectsQueryList.add(haoHan);
}
}
break;
}
}
}
} else {
adapter.notifyDataSetChanged();
break;
}
}
}
//刷新数据
adapter.notifyDataSetChanged();
}