本文主要介绍采用ListView与上下文菜单的配合使用,其中主要是:通过ContentProvider获取手机中联系人列表然后用ListView的形式显示出来,通过ContextMenu操作ListView中的内容。其主要代码的实现如下:

      

  1. package org.lxh.demo;  
  2.  
  3. import java.util.ArrayList;  
  4. import java.util.HashMap;  
  5. import java.util.List;  
  6. import java.util.Map;  
  7.  
  8. import android.app.Activity;  
  9. import android.database.Cursor;  
  10. import android.net.Uri;  
  11. import android.os.Bundle;  
  12. import android.provider.ContactsContract;  
  13. import android.view.ContextMenu;  
  14. import android.view.ContextMenu.ContextMenuInfo;  
  15. import android.view.Menu;  
  16. import android.view.MenuItem;  
  17. import android.view.View;  
  18. import android.widget.AdapterView;  
  19. import android.widget.ListView;  
  20. import android.widget.SimpleAdapter;  
  21. import android.widget.Toast;  
  22.  
  23. public class ContactsDemo extends Activity {  
  24.     /** 返回结果的游标 */ 
  25.     private Cursor result = null;  
  26.     /** 显示信息 */ 
  27.     private ListView contactsList = null;  
  28.     /** 存储数据信息 */ 
  29.     private List<Map<String, Object>> allContacts = null;  
  30.     /** 数据适配器 */ 
  31.     private SimpleAdapter simple = null;  
  32.  
  33.     @Override 
  34.     public void onCreate(Bundle savedInstanceState) {  
  35.         super.onCreate(savedInstanceState);  
  36.         super.setContentView(R.layout.main);  
  37.         // 实例化ListView  
  38.         this.contactsList = (ListView) super.findViewById(R.id.contactsList);  
  39.         // 实例化游标  
  40.         this.result = super.getContentResolver().query(  
  41.                 ContactsContract.Contacts.CONTENT_URI, nullnullnullnull);  
  42.         // 将结果集交给容器管理  
  43.         super.startManagingCursor(this.result);  
  44.         // 实例化List集合  
  45.         this.allContacts = new ArrayList<Map<String, Object>>();  
  46.         // 取出结果集中的每一个内容  
  47.         for (this.result.moveToFirst(); !this.result.isAfterLast(); this.result  
  48.                 .moveToNext()) {  
  49.             // 实例化HashMap  
  50.             Map<String, Object> contact = new HashMap<String, Object>();  
  51.             // 存储一条记录  
  52.             contact.put("_id"this.result.getInt(this.result  
  53.                     .getColumnIndex(ContactsContract.Contacts._ID)));  
  54.             // 存储一条记录  
  55.             contact.put("name"this.result.getString(this.result  
  56.                     .getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)));  
  57.             // 向List中添加一条记录  
  58.             this.allContacts.add(contact);  
  59.         }  
  60.         // 实例化数据适配器  
  61.         this.simple = new SimpleAdapter(thisthis.allContacts,  
  62.                 R.layout.contacts, new String[] { "_id""name" }, new int[] {  
  63.                         R.id._id, R.id.name });  
  64.         this.simple  
  65.                 .setDropDownViewResource(android.R.layout.simple_list_item_checked);  
  66.         // 为ListView设置适配器  
  67.         this.contactsList.setAdapter(this.simple);  
  68.         // 给ListView注册上下文菜单  
  69.         super.registerForContextMenu(this.contactsList);  
  70.     }  
  71.  
  72.     /** 上下文菜单被选中时触发的事件 */ 
  73.     @Override 
  74.     public boolean onContextItemSelected(MenuItem item) {  
  75.         // 实例化info进而通过info.position得到ListView中的那一项(id)被选中,从而生产上下文菜单并显示  
  76.         AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) item  
  77.                 .getMenuInfo();  
  78.         int position = info.position;  
  79.         // 获取联系人的id  
  80.         String contactsId = this.allContacts.get(position).get("_id")  
  81.                 .toString();  
  82.         // 进行上下文菜单的操作  
  83.         switch (item.getItemId()) {  
  84.         // 查看  
  85.         case Menu.FIRST + 1:  
  86.             // 查询的条件  
  87.             String phoneSelection = ContactsContract.CommonDataKinds.Phone.CONTACT_ID  
  88.                     + "=?";  
  89.             // 查询条件所满足的值  
  90.             String[] phoneSelectionArgs = new String[] { contactsId };  
  91.             // 获得查询结果集  
  92.             Cursor c = super.getContentResolver().query(  
  93.                     ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null,  
  94.                     phoneSelection, phoneSelectionArgs, null);  
  95.             // 实例化StringBuffer  
  96.             StringBuffer buf = new StringBuffer();  
  97.             buf.append("电话号码是:");  
  98.             // 遍历查询的结果集  
  99.             for (c.moveToFirst(); !c.isAfterLast(); c.moveToNext()) {  
  100.                 buf.append(  
  101.                         c.getString(c  
  102.                                 .getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)))  
  103.                         .append("、");  
  104.             }  
  105.             // 显示查询的结果  
  106.             Toast.makeText(this, buf, Toast.LENGTH_SHORT).show();  
  107.             break;  
  108.         // 删除  
  109.         case Menu.FIRST + 2:  
  110.             //将所选定的项删除  
  111.             super.getContentResolver().delete(  
  112.                     Uri.withAppendedPath(ContactsContract.Contacts.CONTENT_URI,  
  113.                             contactsId), nullnull);  
  114.             // 删除集合数据项  
  115.             this.allContacts.remove(position);  
  116.             // 通知adapter改变  
  117.             this.simple.notifyDataSetChanged();  
  118.             //显示结果  
  119.             Toast.makeText(this"数据已删除!", Toast.LENGTH_SHORT).show();  
  120.             break;  
  121.         }  
  122.         return super.onContextItemSelected(item);  
  123.     }  
  124.  
  125.     /** 长按某一条目时生成上下文菜单触发的事件 */ 
  126.     @Override 
  127.     public void onCreateContextMenu(ContextMenu menu, View v,  
  128.             ContextMenuInfo menuInfo) { // 创建菜单
  129. //此处的View 为 ListView 此外我们可以通过 AdapterView.AdapterContextMenuInfo info =
  130. (AdapterView.AdapterContextMenuInfo) menuInfo;
  131. // 然后info.position来获取产生上下菜单的ListView中某个条目的id
  132.         super.onCreateContextMenu(menu, v, menuInfo);  
  133.         // 设置上下文菜单的标题  
  134.         menu.setHeaderTitle("联系人操作");  
  135.         // 设置上下文菜单的选项"查看详情"  
  136.         menu.add(Menu.NONE, Menu.FIRST + 11"查看详情");  
  137.         // 设置上下文菜单的选项"删除信息"  
  138.         menu.add(Menu.NONE, Menu.FIRST + 21"删除信息");  
  139.     }  
  140.  

其效果如下:

       采用ListView显示联系人列表:

 

当长按ListView中的某一项时弹出上下文菜单:

 

 

当点击查看详情时弹出一个Toast