- 支持侧边栏索引
- 支持中文,数字,字母模糊搜索
- 支持全选、单选联系人
- 支持检查联系人是否已添加
单选演示
多选演示
功能解析
大部分代码都是比较简单的,这里就不粘贴占用篇幅了,只对几个技术点做下解析,大家可以直接下载源码观摩。
第一个问题:汉字转拼音
依赖tinypinyin库
implementation 'com.github.promeg:tinypinyin:2.0.3'
- 1
拿到第一个汉字传进去,就自动转换成拼音,再取拼音的第一个字符即可
Pinyin.toPinyin(name.charAt(0)).toUpperCase().charAt(0)
- 1
第二个问题:联系人如何从A-Z排序
在第一个问题中我们拿到了每个联系人的首字母,通过Comparator的compareTo对循环中的联系人进行升序排列
/**
* 把联系人按照a b c升序排列
*/
private static ArrayList<ContactInfo> compare(ArrayList<ContactInfo> contactInfos) {
Collections.sort(contactInfos, new Comparator<ContactInfo>() {
@Override
public int compare(ContactInfo o1, ContactInfo o2) {
//升序排列
if (o1.getLetter().equals("@")
|| o2.getLetter().equals("#")) {
return -1;
} else if (o1.getLetter().equals("#")
|| o2.getLetter().equals("@")) {
return 1;
}
return o1.getLetter().compareTo(o2.getLetter());
}
});
return contactInfos;
}
第三个问题:联系人如何按字母分类显显示分类字母
在第二个问题中我们把联系人按字母升序进行了排列,这里我们只需要判断首字母是否相等即可,即如果第一个联系人和第二个联系首字母不同,则说明不是一类,这是在第二个联系人上显示出索引字母即可。
public void onBindViewHolder(ContactAdapter.MyViewHodle holder, final int position) {
ContactInfo contactInfo = mContactList.get(position);
holder.name.setText(contactInfo.getName());
holder.phone.setText(contactInfo.getPhone());
//判断是否显示索引字母
String currentLetter = contactInfo.getLetter();
String previousLetter = position >= 1 ? mContactList.get(position - 1).getLetter() : "";
if (!TextUtils.equals(currentLetter, previousLetter)) {
holder.letter.setVisibility(View.VISIBLE);
holder.letter.setText(currentLetter);
} else {
holder.letter.setVisibility(View.GONE);
}
.....省略.....
}
第四个问题:联系人如何搜索
先取到所有联系人,再循环查找,把搜索到的联系人放入到另一个集合中,再传给RecycleView通知刷新
/**
* 搜索联系人
*
* @param searchKey 搜索key
*/
private void searchContacts(String searchKey) {
for (ContactInfo info : mContactList) {
if (ContactsUtils.searchContact(searchKey, info)) {
mSearchList.add(info);
}
}
}
/**
* 模糊搜索(按中文,数字,字母搜索)
*/
public static boolean searchContact(String searchStr, ContactInfo info) {
return info.getName().contains(searchStr) || info.getPhone().contains(searchStr)
|| searchLowerByAlphabet(searchStr, info) || searchUpperByAlphabet(searchStr, info)
|| Pinyin.toPinyin(info.getName(), "").toLowerCase().contains(searchStr)
|| Pinyin.toPinyin(info.getName(), "").toUpperCase().contains(searchStr);
}
第四个问题:联系人如何选择
通过isChooseContact字段判断是否选择上联系人
第四个问题:联系人如何判断是否已添加
通过isAddContact字段判断是否已添加上联系人