思路步骤:
①新建项目或者Module,在manifest文件中添加读取联系人的权限
②创建一个实体类,用来储存从内存中读取出来的单个的联系人信息
③自定义显示布局样式
④自定义adapter,定义三个属性:
上下文对象Context,
数据源List<自定义实体类>,
布局加载器LayoutInflater,
加载自定义布局,初始化自定义布局中的控件,给他们赋值
⑤在MainAcvitity中实例化自身布局文件中的控件
初始化数据,创建获取联系人的方法并且重写onRequestPermissionsResult方法(需要动态获取权限)
自定义adapter
public class MessageAdapter extends BaseAdapter {
private Context context;
private List<Contact> list;
private LayoutInflater inflater;
public MessageAdapter(Context context, List<Contact> list) {
this.context = context;
this.list = list;
inflater=LayoutInflater.from(context);
}
public void setList(List<Contact> list) {
this.list = list;
}
@Override
public int getCount() {
return list.size();
}
@Override
public Object getItem(int position) {
return list.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder=null;
if (convertView==null) {
holder=new ViewHolder();
convertView=inflater.inflate(R.layout.contact_item,parent,false);
holder.tv_id= (TextView) convertView.findViewById(R.id.tv_id);
holder.tv_name= (TextView) convertView.findViewById(R.id.tv_name);
holder.tv_number= (TextView) convertView.findViewById(R.id.tv_number);
convertView.setTag(holder);
}else {
holder= (ViewHolder) convertView.getTag();
}
Contact contact= (Contact) getItem(position);
holder.tv_id.setText(String.valueOf(contact.getId()).toString());
holder.tv_name.setText(contact.getName().toString());
holder.tv_number.setText(contact.getPhone_number().toString());
return convertView;
}
class ViewHolder{
private TextView tv_id,tv_name,tv_number;
}
MainAcvitity。Java
public class MainActivity extends AppCompatActivity {
private Button btn_getContact;
private ListView lv_message;
private static final int REQUEST_CODE=1;
private List<Contact> contacts=new ArrayList<>();
private MessageAdapter adapter=null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
getContacts();
}
private void initView(){
btn_getContact= (Button) findViewById(R.id.btn_getContact);
lv_message= (ListView) findViewById(R.id.lv_message);
btn_getContact.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(ContextCompat.checkSelfPermission(getApplicationContext(), Manifest.permission.READ_CONTACTS)!=
PackageManager.PERMISSION_GRANTED){
ActivityCompat.requestPermissions(MainActivity.this,
new String[]{Manifest.permission.READ_CONTACTS},REQUEST_CODE);
}else {
contacts=getContacts();
adapter=new MessageAdapter(MainActivity.this,contacts);
lv_message.setAdapter(adapter);
}
}
});
}
private List<Contact> getContacts(){
List<Contact> list=new ArrayList<>();
String[] colums={ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME,
ContactsContract.CommonDataKinds.Phone.NUMBER, ContactsContract.CommonDataKinds.Phone.CONTACT_ID};
Cursor cursor=getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,colums,null,null,null);
if(cursor!=null){
while (cursor.moveToNext()){
String phoneNum=cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
if(TextUtils.isEmpty(phoneNum)){
continue;
}
String name=cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
int id=cursor.getInt(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.CONTACT_ID));
list.add(new Contact(id,name,phoneNum));
}
cursor.close();
}
return list;
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if(requestCode==REQUEST_CODE){
if(grantResults[0]==PackageManager.PERMISSION_GRANTED){
contacts=getContacts();
adapter.notifyDataSetChanged();
adapter=new MessageAdapter(this,contacts);
}else {
Toast.makeText(this,"请开启权限",Toast.LENGTH_SHORT).show();
}
}
}