本文主要介绍采用ListView与上下文菜单的配合使用,其中主要是:经过ContentProvider获取手机中联系人列表而后用ListView的形式显示出来,经过ContextMenu操做ListView中的内容。其主要代码的实现以下: java
- package org.lxh.demo;
- import java.util.ArrayList;
- import java.util.HashMap;
- import java.util.List;
- import java.util.Map;
- import android.app.Activity;
- import android.database.Cursor;
- import android.net.Uri;
- import android.os.Bundle;
- import android.provider.ContactsContract;
- import android.view.ContextMenu;
- import android.view.ContextMenu.ContextMenuInfo;
- import android.view.Menu;
- import android.view.MenuItem;
- import android.view.View;
- import android.widget.AdapterView;
- import android.widget.ListView;
- import android.widget.SimpleAdapter;
- import android.widget.Toast;
- public class ContactsDemo extends Activity {
- /** 返回结果的游标 */
- private Cursor result = null;
- /** 显示信息 */
- private ListView contactsList = null;
- /** 存储数据信息 */
- private List<Map<String, Object>> allContacts = null;
- /** 数据适配器 */
- private SimpleAdapter simple = null;
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- super.setContentView(R.layout.main);
- // 实例化ListView
- this.contactsList = (ListView) super.findViewById(R.id.contactsList);
- // 实例化游标
- this.result = super.getContentResolver().query(
- ContactsContract.Contacts.CONTENT_URI, null, null, null, null);
- // 将结果集交给容器管理
- super.startManagingCursor(this.result);
- // 实例化List集合
- this.allContacts = new ArrayList<Map<String, Object>>();
- // 取出结果集中的每个内容
- for (this.result.moveToFirst(); !this.result.isAfterLast(); this.result
- .moveToNext()) {
- // 实例化HashMap
- Map<String, Object> contact = new HashMap<String, Object>();
- // 存储一条记录
- contact.put("_id", this.result.getInt(this.result
- .getColumnIndex(ContactsContract.Contacts._ID)));
- // 存储一条记录
- contact.put("name", this.result.getString(this.result
- .getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)));
- // 向List中添加一条记录
- this.allContacts.add(contact);
- }
- // 实例化数据适配器
- this.simple = new SimpleAdapter(this, this.allContacts,
- R.layout.contacts, new String[] { "_id", "name" }, new int[] {
- R.id._id, R.id.name });
- this.simple
- .setDropDownViewResource(android.R.layout.simple_list_item_checked);
- // 为ListView设置适配器
- this.contactsList.setAdapter(this.simple);
- // 给ListView注册上下文菜单
- super.registerForContextMenu(this.contactsList);
- }
- /** 上下文菜单被选中时触发的事件 */
- @Override
- public boolean onContextItemSelected(MenuItem item) {
- // 实例化info进而经过info.position获得ListView中的那一项(id)被选中,从而生产上下文菜单并显示
- AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) item
- .getMenuInfo();
- int position = info.position;
- // 获取联系人的id
- String contactsId = this.allContacts.get(position).get("_id")
- .toString();
- // 进行上下文菜单的操做
- switch (item.getItemId()) {
- // 查看
- case Menu.FIRST + 1:
- // 查询的条件
- String phoneSelection = ContactsContract.CommonDataKinds.Phone.CONTACT_ID
- + "=?";
- // 查询条件所知足的值
- String[] phoneSelectionArgs = new String[] { contactsId };
- // 得到查询结果集
- Cursor c = super.getContentResolver().query(
- ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null,
- phoneSelection, phoneSelectionArgs, null);
- // 实例化StringBuffer
- StringBuffer buf = new StringBuffer();
- buf.append("电话号码是:");
- // 遍历查询的结果集
- for (c.moveToFirst(); !c.isAfterLast(); c.moveToNext()) {
- buf.append(
- c.getString(c
- .getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)))
- .append("、");
- }
- // 显示查询的结果
- Toast.makeText(this, buf, Toast.LENGTH_SHORT).show();
- break;
- // 删除
- case Menu.FIRST + 2:
- //将所选定的项删除
- super.getContentResolver().delete(
- Uri.withAppendedPath(ContactsContract.Contacts.CONTENT_URI,
- contactsId), null, null);
- // 删除集合数据项
- this.allContacts.remove(position);
- // 通知adapter改变
- this.simple.notifyDataSetChanged();
- //显示结果
- Toast.makeText(this, "数据已删除!", Toast.LENGTH_SHORT).show();
- break;
- }
- return super.onContextItemSelected(item);
- }
- /** 长按某一条目时生成上下文菜单触发的事件 */
- @Override
- public void onCreateContextMenu(ContextMenu menu, View v,
- ContextMenuInfo menuInfo) { // 建立菜单
- //此处的View 为 ListView 此外咱们能够经过 AdapterView.AdapterContextMenuInfo info =
- (AdapterView.AdapterContextMenuInfo) menuInfo;
- // 而后info.position来获取产生上下菜单的ListView中某个条目的id
- super.onCreateContextMenu(menu, v, menuInfo);
- // 设置上下文菜单的标题
- menu.setHeaderTitle("联系人操做");
- // 设置上下文菜单的选项"查看详情"
- menu.add(Menu.NONE, Menu.FIRST + 1, 1, "查看详情");
- // 设置上下文菜单的选项"删除信息"
- menu.add(Menu.NONE, Menu.FIRST + 2, 1, "删除信息");
- }
- }
其效果以下: android
采用ListView显示联系人列表: app
当长按ListView中的某一项时弹出上下文菜单: ide
当点击查看详情时弹出一个Toast this