最近项目用到了蓝牙电话本的搜索(UE规定按照手机搜索模式即可通过号码和姓名各个首字母进行搜索,edittext中input越多,显示ListView结果应该越精准)
附上搜索代码:
/**
* 监听文字是否变化
*/
private TextWatcher searchWatcher = new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int arg1, int arg2, int arg3) {
Log.v(TAG,"S = "+ s + " arg1 = " + arg1 + " arg2 = " + arg2 + " arg3 = " + arg3);
if (null != mBlueToothAdatpter) {
if (s.length() > 0) {
filterList.clear();
boolean isDigit = s.toString().matches("[0-9]{1,}");
if (isDigit) {
for (int i = 0; i < btContactsData.size(); i++) {
ContactData c = btContactsData.get(i);
ArrayList<String> numberList = (ArrayList<String>) c
.getPhoneNumList();
for (String number : numberList) {
Debug.LogD(TAG,"number : "+ number);
//s.toString()必须,否则会跳开 ; number.startsWith 可以实现从头开始搜索
if (number.contains(s.toString())&& number.startsWith(s.toString())) {
filterList.add(c);
break;
}
}
}
} else {
for (int i = 0; i < btContactsData.size(); i++) {
ContactData c = btContactsData.get(i);
String pinyinHead = c.getPinYinHead();
Debug.LogD(TAG, "pinyinHead: = "+pinyinHead);
//此处不能用equals 否则 匹配数量很少
if (pinyinHead.contains(s.toString().toUpperCase()) && pinyinHead.startsWith(s.toString().toUpperCase())) {
filterList.add(c);
}else{
String pinyin = c.getPinYin();
if (pinyin.contains(s.toString().toUpperCase()) && pinyin.startsWith(s.toString().toUpperCase())) {
filterList.add(c);
} else {
String name = c.getName().toUpperCase();
if (name.contains(s.toString().toUpperCase()) && name.startsWith(s.toString().toUpperCase())) {
filterList.add(c);
}
}
}
}
}
mBlueToothAdatpter.setList(filterList);
mBlueToothAdatpter.notifyDataSetChanged();
if (mBlueToothAdatpter.getCount() == 0) {
noResault.setVisibility(View.VISIBLE);
noResault.setText(R.string.no_Result);
} else
noResault.setText("");
} else {
mBlueToothAdatpter.setList(btContactsData);
mBlueToothAdatpter.notifyDataSetChanged();
}
}
}
CharSequence s 代表用户需要搜索输入字符