获取系统通讯录,自定义通讯录展示:基于RecyclerView实现列表展示。
image
技术:
RecyclerView、首字母排序(汉字转拼音)、侧边栏View实现、PopupWindow(气泡)。
1、创建通讯录实体类:
public class Contact implements Serializable {
private String letter; // 首字母
private String name; // 姓名
private String number; // 号码
...
}
这里继承了Serializable接口,方便Activity之间传递对象数据。
2、获取通讯录:
2.1:申请权限:
private void initData() {
if(ContextCompat.checkSelfPermission(this, Manifest.permission.READ_CONTACTS)
!= PackageManager.PERMISSION_GRANTED){
String[] list = { Manifest.permission.READ_CONTACTS };
ActivityCompat.requestPermissions(this, list, 1);
}else {
readContacts();
}
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == 1){
if(grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED){
readContacts();
}
}
}
2.2 获取通讯录信息:
并将通讯录数据简单处理存入ArrayList中
2.2.1
获取通讯录数据
ContentResolver contentResolver = this.getContentResolver();
Cursor cursor = contentResolver.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
null, null, null, null);
cursor.getCount();
ArrayList data = new ArrayList<>();
while(cursor.moveToNext()) {
String name = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
String number = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
Contact contact = new Contact();
contact.setName(name);
contact.setNumber(number);
data.add(contact);
}
cursor.close();
mContact = filledData(data);
Collections.sort(mContact, mComparator);
Collections.sort(mContact, mComparator);是用于对数据进行排序的。
mComparator是自定义的一个工具类。
2.2.2
对通讯录数据进行排序处理:
// 为list填充数据
private ArrayList filledData(ArrayList data){
ArrayList list = new ArrayList<>();
for (int i = data.size() - 1; i >= 0; i--) {
Contact sm = new Contact();
sm.setName(data.get(i).getName());
sm.setNumber(data.get(i).getNumber());
String pinyin = mParser.getSelling(data.get(i).getName());
String sortString = pinyin.substring(0, 1).toUpperCase();
if (sortString.matches("[A-Z]")) {
sm.setLetter(sortString);
} else {
sm.setLetter("#");
}
list.add(sm);
}
return list;
}
这里mParser用到了一个工具类:
private CharacterParser mParser = CharacterParser.getInstance();
用于将汉字转为拼音。
2.2.3 定义布局文件:
main_activity.xml,
view_contact.xml,
布局可根据自身需求定义。
2.2.4 实现Adapter:
常规RecycleView的Adapter定义,这里还添加