关于获取手机通讯录小结
1. 获取手机通讯录信息
a.获取手机通讯录
Cursorcursor = context.getContentResolver().query(Phone.CONTENT_URI,null,null,null,null);
àpublic abstractContentResolvergetContentResolver()
Return aContentResolver instance for your application's package.
->ContentResolver
This classprovides applications access to the content model
这个类提供申请访问content模型
->Cursor
Thisinterface provides random read-write access to the result set returned by adatabase query
接口提供了随机读写访问数据查询结果集.
->public final Cursorquery(Uri uri,String[] projection, String selection, String[] selectionArgs, StringsortOrder)
Query the given URI, returning a Cursor over the result set.
b.获取联系人和号码
phoneNumber = cursor.getString(cursor.getColumnIndex(Phone.NUMBER)); phomeName = cursor.getString(cursor.getColumnIndex(Phone.DISPLAY_NAME));
c.添加手机通讯录权限
<uses-permission android:name="android.permission.GET_ACCOUNTS"/> <uses-permission android:name="android.permission.WRITE_CONTACTS"/> <uses-permission android:name="android.permission.READ_CONTACTS"/>
此处注意
如果targetSdkVersion >= 23 ,则需要动态申请权限, 参考http://blog.youkuaiyun.com/u011200604/article/details/52874599
如果不打算动态申请权限,targetSdkVersion 最大只能设置22
2. 手机通讯录信息的封装
a. 创建一个类添加 name 和 number字段
b. 实现set和get方法
c. 封装
//创建 一个集合 public static List<PhoneInfo> lists = new ArrayList<PhoneInfo>();
PhoneInfo phoneInfo = new PhoneInfo(phomeName, phoneNumber); lists.add(phoneInfo);
3. 手机通讯录UI的适配
a.ListView 控件需要传递adapter,自定义adapter继承自BaseAdapter 复写四个方法
getCount()
getItem(int i)
getItemId(int i)
getView(int i, View view, ViewGroup viewGroup)
b.实现xml布局
c.完成getView方法(实际上是参照4来写)
//获取当前加载的view
获取加载view的权限
LayoutInflater inflater = LayoutInflater.from(mContext);
通过Layout 对象进项加载
mRelativeLayout = (RelativeLayout) inflater.inflate(R.layout.cell, null);
TextView name = (TextView) mRelativeLayout.findViewById(R.id.name);
TextView number = (TextView) mRelativeLayout.findViewById(R.id.number);
将获取的内容添加进来
name.setText(lists.get(i).getName());
number.setText(lists.get(i).getNumber());
d. 在主函数中添加adapter
// 实例化Adapter adapter = new MyAdapter(GetNumber.lists,this); // 绑定 lv.setAdapter(adapter);
4. Android中ListView的优化
a.通过ViewHolder进行优化,创建一个静态的ViewHolder类,包括name 和number两个TextView。
b.在getView 中通过ViewHolder加载两个TextView对象
c. public void setTag(Object tag)
Added inAPI level 1
Sets the tag associated with this view. A tag can be usedto mark a view in its hierarchy and does not have to be unique within thehierarchy. Tags can also be used to store data within a view without resortingto another data structure.
view.setTag(holder);//储存标签
holder = (ViewHolder)view.getTag();//不在重新加载view,获取之前存储的view即可
@Override public View getView(int i, View view, ViewGroup viewGroup) { /* //获取当前加载的view // 获取加载view的权限 LayoutInflater inflater = LayoutInflater.from(mContext); // 通过 mLinearLayout 对对象进项加载 mRelativeLayout = (RelativeLayout) inflater.inflate(R.layout.cell, null); TextView name = (TextView) mRelativeLayout.findViewById(R.id.name); TextView number = (TextView) mRelativeLayout.findViewById(R.id.number); // 将获取的内容添加进来 name.setText(lists.get(i).getName()); number.setText(lists.get(i).getNumber());*/ ViewHolder holder; if (view == null) { view = LayoutInflater.from(mContext).inflate(R.layout.cell, null); holder = new ViewHolder(); holder.name = (TextView) view.findViewById(R.id.name); holder.number = (TextView) view.findViewById(R.id.number); holder.name.setText(lists.get(i).getName()); holder.number.setText(lists.get(i).getNumber()); view.setTag(holder);//储存标签 } else {
holder = (ViewHolder) view.getTag();//不在重新加载view,获取之前存储的view即可 holder.name.setText(lists.get(i).getName()); holder.number.setText(lists.get(i).getNumber()); } return view; }