Android 通信录
简单的实现了一个Android通信录
1 获取系统的联系人与电话号码html
public class GetNumber {
//建立一个集合,类型为咱们封装的数据的类型PhoenInfo
public static List<PhoenInfo> lists = new ArrayList<PhoenInfo>();
public static String getNumber(Context context) {
//获取手机通信录,通信录在手机里面是经过数据库储存的,系统向外公布一个接口供查询
//由于存在数据库里面,因此返回的是一个Cursor类型
Cursor cursor = context.getContentResolver().query(Phone.CONTENT_URI, null, null, null, null);
//获取到数据以后,经过循环将数据一一打印出来
//建立一个对象来存储电话号码和联系人
String phoneNumber;
String phoneName;
while (cursor.moveToNext()) {
//获取number字段
phoneNumber = cursor.getString(cursor.getColumnIndex(Phone.NUMBER));
//获取联系人
phoneName = cursor.getString(cursor.getColumnIndex(Phone.DISPLAY_NAME));
//建立一个PhoneInfo的对象
PhoenInfo phoenInfo=new PhoenInfo(phoneName,phoneNumber);
//再把这些数据放到集合当中去
lists.add(phoenInfo);
}
return null;
}
2 将获取的数据封装起来
public class PhoenInfo {
private String name;
private String number;
//建立一个构造方法,由于number有地区+86的状况
public PhoenInfo(String name, String number) {
setName(name);
setNumber(number);
}
public String getNumber() {
return number;
}
public String getName() {
return name;
}
public void setNumber(String number) {
this.number = number;
}
public void setName(String name) {
this.name = name;
}
}
3 创建适配器与ListView绑定java
public class MyAdapter extends BaseAdapter {
//自定义的Adapter所须要的参数有两个:一个具体的内容也就是集合List,第二个是咱们须要承接上下文
private List<PhoenInfo> lists;
private Context context;
//声明一个布局文件
private LinearLayout layout;
//下面建立一个构造方法,在里面进行传递参数
public MyAdapter(List<PhoenInfo> lists, Context context) {
this.lists = lists;
this.context = context;
}
@Override
public int getCount() {
return lists.size();//返回的是集合的数量
}
@Override
public Object getItem(int position) {
return lists.get(position);//返回咱们当前的这条数据:lists.get(position)获取当前的数据
}
@Override
public long getItemId(int position) {
return position;//返回当前的ID,ID与position是相等的
}
//这个方法里面最重要的是咱们必需要获取到当前要加载的View,同时把内容加载到视图当中。在获取以前,
// 咱们要建立一个子View,也就是Listview当中每一条数据显示的格式
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// //获取加载view的权限
// LayoutInflater inflater = LayoutInflater.from(context);
// //经过layout对象来进行加载
// layout = (LinearLayout) inflater.inflate(R.layout.call, null);
// //声明两个TextView
// TextView namwtv = (TextView) layout.findViewById(R.id.tv_name);
// TextView numberTv = (TextView) layout.findViewById(R.id.tv_number);
// //把内容添加进去,里面的内容确定是经过集合来进行获取
// namwtv.setText(lists.get(position).getName());
// numberTv.setText(lists.get(position).getNumber());
//建立ViewHolder对象
ViewHolder holder;
if (convertView == null) {
//若是等于空说明本没有加载View,咱们就要加载一个VIew
convertView = LayoutInflater.from(context).inflate(R.layout.call, null);
//要想经过ViewHolder加载两个TextView,要对ViewHolder进行实例化
holder = new ViewHolder();
//接着经过ViewHolder对象来找到两个TextView
holder.nametv = (TextView) convertView.findViewById(R.id.tv_name);
holder.numbertv = (TextView) convertView.findViewById(R.id.tv_number);
//加载内容
holder.nametv.setText(lists.get(position).getName());
holder.numbertv.setText(lists.get(position).getNumber());
//第一次加载完毕,要用setTag存储一下
convertView.setTag(holder);
} else {
//而后去加载内容
holder = (ViewHolder) convertView.getTag();
holder.nametv.setText(lists.get(position).getName());
holder.numbertv.setText(lists.get(position).getNumber());
}
return convertView;
}
//对listView进行优化
private static class ViewHolder {
//承载两条内容
TextView nametv;
TextView numbertv;
}
}
4 MainActivity
public class MainActivity extends AppCompatActivity {
private ListView listView;
private MyAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
GetNumber.getNumber(this);//调用一些GetNumber的类
listView= (ListView) findViewById(R.id.lv);
//实例化Adapter,GetNumber.lists当中的list是静态的,能够直接使用
adapter=new MyAdapter(GetNumber.lists,this);
//绑定
listView.setAdapter(adapter);
}
}
5 不要忘记加权限android
<uses-permission android:name="android.permission.READ_CONTACTS"></uses-permission>