ListView与上下文菜单

原创做品,容许转载,转载时请务必以超连接形式标明文章 原始出处 、做者信息和本声明。不然将追究法律责任。 http://splend.blog.51cto.com/3717743/965219

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

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

其效果以下: android

采用ListView显示联系人列表: app

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

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

相关文章
相关标签/搜索