获取手机通讯录放入PinnedSectionListView中,按名字首字母排序,并且实现拨打电话功能。
- package com.lixu.tongxunlu;
- import java.util.ArrayList;
- import com.lixu.tongxunlu.PinnedSectionListView.PinnedSectionListAdapter;
- import android.app.Activity;
- import android.content.ContentResolver;
- import android.content.Context;
- import android.content.Intent;
- import android.database.Cursor;
- import android.graphics.Color;
- import android.net.Uri;
- import android.os.Bundle;
- import android.provider.ContactsContract;
- import android.view.LayoutInflater;
- import android.view.View;
- import android.view.ViewGroup;
- import android.view.Window;
- import android.view.WindowManager;
- import android.widget.AdapterView;
- import android.widget.AdapterView.OnItemClickListener;
- import android.widget.ArrayAdapter;
- import android.widget.TextView;
- public class MainActivity extends Activity {
- private ArrayList<Contacts> contacts;
- private ArrayList<Data> data;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- // 去掉标题头
- requestWindowFeature(Window.FEATURE_NO_TITLE);
- setContentView(R.layout.activity_main);
- // 设置程序全屏
- toggleFullscreen(true);
- data = new ArrayList<Data>();
- contacts = new ArrayList<Contacts>();
- // 获取手机联系人后装到contacts中
- getcontacts(contacts);
- int A = (int) 'A';
- for (int i = 0; i < 26; i++) {
- int letter = A + i;
- char c = (char) letter;
- Data group = new Data();
- group.type = Data.GROUP;
- group.text = c + "";
- data.add(group);
- for (int j = 0; j < contacts.size(); j++) {
- Contacts cc = contacts.get(j);
- String ss = cc.firstLetterofNmae();
- // 判断联系人名字首字母是否和组名字母一样,一样后加入本组
- if (ss.equals(group.text)) {
- Data child = new Data();
- child.type = Data.CHILD;
- child.text = cc.name + "" + cc.getPhoneNumbers();
- child.contacts = cc;
- data.add(child);
- }
- }
- }
- PinnedSectionListView pslv = (PinnedSectionListView) findViewById(R.id.pslv);
- pslv.setAdapter(new MyAdapter(this, -1));
- pslv.setOnItemClickListener(new OnItemClickListener() {
- @Override
- public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
- // 判断点击子菜单才会触发点击事件
- if (data.get(position).type == Data.CHILD) {
- Data datas = data.get(position);
- Contacts contact = datas.contacts;
- // 获取电话号码
- String number = contact.getPhoneNumbers();
- Intent intent = new Intent(Intent.ACTION_CALL, Uri.parse("tel:" + number));
- startActivity(intent);
- }
- }
- });
- }
- // 设置程序全屏的方法
- public void toggleFullscreen(boolean fullScreen) {
- // fullScreen为true时全屏
- WindowManager.LayoutParams attrs = getWindow().getAttributes();
- if (fullScreen) {
- attrs.flags |= WindowManager.LayoutParams.FLAG_FULLSCREEN;
- } else {
- attrs.flags &= ~WindowManager.LayoutParams.FLAG_FULLSCREEN;
- }
- getWindow().setAttributes(attrs);
- }
- private class Data {
- public static final int GROUP = 0;
- public static final int CHILD = 1;
- public static final int STYE = 2;
- public String text;
- public int type;
- public Contacts contacts = null;
- }
- private class MyAdapter extends ArrayAdapter implements PinnedSectionListAdapter {
- private LayoutInflater flater;
- public MyAdapter(Context context, int resource) {
- super(context, resource);
- flater = LayoutInflater.from(context);
- }
- @Override
- public int getCount() {
- return data.size();
- }
- @Override
- public Object getItem(int position) {
- return data.get(position);
- }
- @Override
- public int getItemViewType(int position) {
- return data.get(position).type;
- }
- @Override
- public int getViewTypeCount() {
- return Data.STYE;
- }
- @Override
- public View getView(int position, View convertView, ViewGroup parent) {
- int type = getItemViewType(position);
- Data data = (Data) getItem(position);
- switch (type) {
- case Data.GROUP:
- if (convertView == null)
- convertView = flater.inflate(android.R.layout.simple_list_item_1, null);
- TextView tv = (TextView) convertView.findViewById(android.R.id.text1);
- tv.setBackgroundColor(Color.GREEN);
- tv.setTextSize(35);
- tv.setText(data.text);
- break;
- case Data.CHILD:
- if (convertView == null)
- convertView = flater.inflate(android.R.layout.simple_list_item_1, null);
- TextView tv1 = (TextView) convertView.findViewById(android.R.id.text1);
- tv1.setTextSize(20);
- tv1.setText(data.text);
- break;
- default:
- break;
- }
- return convertView;
- }
- @Override
- public boolean isItemViewTypePinned(int viewType) {
- boolean type = false;
- switch (viewType) {
- case Data.CHILD:
- type = false;
- break;
- case Data.GROUP:
- type = true;
- break;
- default:
- break;
- }
- return type;
- }
- }
- // 获取手机联系人的方法
- private void getcontacts(ArrayList<Contacts> contacts) {
- Uri uri = Uri.parse("content://com.android.contacts/contacts");
- ContentResolver resolver = this.getContentResolver();
- // 给query传递一个SORT_KEY_PRIMARY,让ContentResolver将获得的数据按照联系人名字首字母排序
- Cursor cursor = resolver.query(uri, null, null, null,
- android.provider.ContactsContract.Contacts.SORT_KEY_PRIMARY);
- while (cursor.moveToNext()) {
- // 联系人的id
- String id = cursor.getString(cursor.getColumnIndex(android.provider.ContactsContract.Contacts._ID));
- // 将联系人按姓名首字母分组
- String sort_key_primary = cursor
- .getString(cursor.getColumnIndex(android.provider.ContactsContract.Contacts.SORT_KEY_PRIMARY));
- // 获取联系人的名字
- String name = cursor
- .getString(cursor.getColumnIndex(android.provider.ContactsContract.Contacts.DISPLAY_NAME));
- Contacts mContacts = new Contacts();
- mContacts.id = id;
- mContacts.name = name;
- mContacts.sort_key_primary = sort_key_primary;
- // 获取联系人手机号码
- Cursor phone = resolver.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null,
- ContactsContract.CommonDataKinds.Phone.CONTACT_ID + "=" + id, null, null);
- // 将获取到的号码遍历
- ArrayList<String> phonenumbers = new ArrayList<String>();
- while (phone.moveToNext()) {
- int phoneFieldColumnIndex = phone.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER);
- String phonenumber = phone.getString(phoneFieldColumnIndex);
- phonenumbers.add(phonenumber);
- }
- mContacts.phonenumbers = phonenumbers;
- contacts.add(mContacts);
- }
- }
- private class Contacts {
- public String id;
- public String name;
- public String sort_key_primary;
- public ArrayList<String> phonenumbers;
- // 获取汉字首字母转换成大写字母
- public String firstLetterofNmae() {
- String s = sort_key_primary.charAt(0) + "";
- return s.toUpperCase();
- }
- public String getPhoneNumbers() {
- String phones = "";
- for (int i = 0; i < phonenumbers.size(); i++) {
- phones += ":" + phonenumbers.get(i);
- }
- return phones;
- }
- }
- }
xml文件:
不要忘记添加各种权限。
- <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:tools="http://schemas.android.com/tools"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:padding="10dp" >
- <com.lixu.tongxunlu.PinnedSectionListView
- android:id="@+id/pslv"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content" />
- </RelativeLayout>
效果示例图:
获取手机通讯录放入PinnedSectionListView中,按名字首字母排序,并且实现拨打电话功能。的更多相关文章
- mysql、oracle 中按照拼音首字母排序
mysql中按照拼音首字母排序 convert(name using gbk) ASC 注:name 为字段名称 oracle中按照拼音首字母排序 nlssort(enterprise_name,'N ...
- 联系人的侧边字母索引ListView 将手机通讯录姓名通过首字母排序。
package com.lixu.letterlistview; import java.util.ArrayList; import java.util.List; import org.apa ...
- java通过文件路径读取该路径下的所有文件并将其放入list中
java通过文件路径读取该路径下的所有文件并将其放入list中 java中可以通过递归的方式获取指定路径下的所有文件并将其放入List集合中.假设指定路径为path,目标集合为fileList,遍 ...
- .Net中把图片等文件放入DLL中,并在程序中引用
原文:.Net中把图片等文件放入DLL中,并在程序中引用 [摘要] 有时我们需要隐藏程序中的一些资源,比如游戏,过关后才能看到图片,那么图片就必须隐藏起来,否则不用玩这个游戏就可以看到你的图片了,呵呵 ...
- iOS中获取本地通讯录联系人以及汉字首字母排序
iOS中获取手机通讯录中的联系人信息: /*** 加载本地联系人*/ - (void)loadLocalContacts { //新建一个通讯录类 ABAddressBookRef addressBo ...
- set是无序集合,放入set中的元素通过iterator输出时候是无序的
set是无序集合,放入set中的元素通过iterator输出时候是无序的 HashMap<String , String> hashMap = new HashMap<String ...
- tuple放入dict中
tuple放入dict中是否可以正常运行 # 将tuple放入dict中 a = ('AI','Kobe','Yao') b = ('AI',['Kobe','Yao']) dict1 = {'a': ...
- 在查询时将查询条件放入Session中,导出时直接根据qpniRGaFiler取查询条件即可
在查询时将查询条件放入Session中,导出时直接根据qpniRGaFiler取查询条件即可
- 用MT.exe将exe中的manifest文件提取出来和将manifest文件放入exe中
前一种方法是将manifest文件放入exe中,但是要记得需要在工程中设置 这样的话exe中就不存在manifest了,在debug目录下就会看到相应的manifest文件.后者是将exe中的man ...
随机推荐
- c++ primer 的 textquery 例子。
总共3种方法,一种是第四版书上的面向对象的教学方法.一种是实际中应该使用的简洁方法.一种是模板的方法. 1)第四版书中,面向对象的方法,基类,继承,多态 2)自己的更简洁的写法.(前提条件:如果不需要 ...
- mysql Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)
错误原因:/var/lib/mysql目录中socket文件不存在.连接mysql服务器有两种方式:tcp连接,通过socket文件连接.通过socket文件,启动mysql服务,mysql服务会自动 ...
- Oracle的参数文件
参数文件的作用: 它们是在数据库实例启动时候加载的,决定了数据库的物理结构.内存.数据库的限制及系统大量的默认值.数据库的各种物理属性.指定数据库控制文件名和路径等信息,是进行数据库设计和性能调优的重 ...
- 关于json 的那些知识点
深入理解JSON对象 前面的话 json(javascript object notation)全称是javascript对象表示法,它是一种数据交换的文本格式,而不是一种编程语言,用于读取结构化数据 ...
- Lua了解 & 为什么游戏开发用Lua
参考这篇文章 https://www.zhihu.com/question/21717567 看来就是网易风云为了让人写外挂不方便而采用的冷门语言.当然冷门的语言不代表不好用啦. Lua 虚拟机小,嵌 ...
- Android 热补丁动态修复框架小结
一.概述 最新github上开源了很多热补丁动态修复框架,大致有: https://github.com/dodola/HotFix https://github.com/jasonross/Nuwa ...
- PLSQL Developer连接远程Oracle方法(非安装客户端)
Oracle比较麻烦,通常需要安装oracle的客户端才能实现.通过instantclient可以比较简单的连接远程的Oracle. 1.新建目录D:\Oracle_Cleint用于存放相关文件,新建 ...
- VS2013和VS2008项目的互通
VS2013和VS2008项目的互通,大家可能都查到了百度经验里面的一个帖子: http://jingyan.baidu.com/article/f54ae2fc3c3adc1e92b849de.ht ...
- iOS开发 Date转字符串
+ (NSString *)formatterDate:(NSNumber *)desDate WithDateFormatter:(NSString *)formatter{ NSDateForma ...
- Fragment的2中载入方式!
1.静态有动态 代码如下: public class MainActivity extends AppCompatActivity { private ContentFragment cf; @Ove ...