【冠亚体育手机网站】Android通讯录开发之删除功能的实现方法,创建菜单Menu详解

无论是Android开发或者是其他移动平台的开发,ListView肯定是一个大咖,那么对ListView的操作肯定是不会少的,上一篇博客介绍了如何实现全选和反选的功能,本篇博客介绍删除功能,删除列表中的项无谓就是及时刷新列表,这又跟UI线程扯上关系了,还是那句话,数据的更新通知一定要在UI线程上做,不然会出现各种错误,比如出现adapter数据源改变,但没有及时收到通知的情况。在执行遍历删除的时候,最好不要每删一个就直接通知,下面是我的实现方法,将需要删除的contact保存到一个List然后通过handler发生消息,然后再由handler来处理。

Android一共有三种形式的菜单:
            1.选项菜单(optinosMenu)
            2.上下文菜单(ContextMenu)
            3.子菜单(subMenu)
其中最常用的就是选项菜单(optionsMenu), 该菜单在点击 menu 按键
后会在对应的Activity底部显示出来。

冠亚体育手机网站 1

1.Activity菜单机制 (与dialog类似)
Activity有一套机制来实现对菜单的管理,方法如下:
   1.public boolean onCreateOptionsMenu(Menu menu)
此方法用于初始化菜单,其中menu参数就是即将要显示的Menu实例。              返回true则显示该menu,false 则不显示;(只会在第一次初始化菜单时调用)
2.public boolean ``onPrepareOptionsMenu(Menu menu)             在onCreateOptionsMenu执行后,菜单被显示前调用;如果菜单已经被创建,则在菜单显示前被调用。
             
同样的,返回true则显示该menu,false 则不显示;             (可以通过此方法动态的改变菜单的状态,比如加载不同的菜单等)           3.public void onOptionsMenuClosed(Menu menu)              每次菜单被关闭时调用.              (菜单被关闭有三种情形,menu按钮被再次点击、back按钮被点击或者用户选择了某一个菜单项)
              
            4.public boolean onOptionsItemSelected(MenuItem item)
               菜单项被点击时调用,也就是菜单项的监听方法。
              
         
通过这几个方法,可以得知,对于Activity,同一时间只能显示和监听一个Menu
对象。

冠亚体育手机网站 2


  2. 添加菜单:

      可以在onCreateOptionsMenu或者onPrepareOptionsMenu方法中来添加菜单     
2.1代码添加:

        menu.add((int groupId, int itemId, int order, charsequence
title) .setIcon(drawable ID)

冠亚体育手机网站 3

       add()方法的四个参数,依次是: 

冠亚体育手机网站 4

      1、组别,如果不分组的话就写Menu.NONE, 

这里我顺带提一下菜单的实现
1、定义menu下的xml文件

      2、Id,这个很重要,Android根据这个Id来确定不同的菜单 

复制代码 代码如下:

      3、顺序,哪个菜单项在前面由这个参数的大小决定 

<menu xmlns:android=”” >

      4、文本,菜单项的显示文本

    <group android:id=”@+id/metting_menu” >
        <item
            android:id=”@+id/select_all_item”
            android:icon=”@drawable/select_all_not”
            android:title=”全选”>
        </item>
        <item
            android:id=”@+id/delete_item”
            android:icon=”@drawable/delete”
            android:title=”删除”>
        </item>
        <item
            android:id=”@+id/sync_item”
            android:icon=”@drawable/sync_manage”
            android:title=”同步”>
        </item>
    </group>

      
add()方法返回的是MenuItem对象,调用其setIcon()方法,为相应MenuItem设置Icon

</menu>

     示例:
    public boolean onCreateOptionsMenu(Menu menu) {
        super.onCreateOptionsMenu(menu);
        menu.add(Menu.NONE, Menu.First+1, 0,
“设置”).setIcon(R.drawable.setting);
        return true;
    }
      
      2.2布局文件添加:
         
       getMenuInflater().inflate(R.menu.options_menu, menu);

icon为菜单图标
title为菜单文本

      调用Activity的getMenuInflater()得到一个MenuInflater, 
       使用inflate方法来把布局文件中的定义的菜单 加载给
第二个参数所对应的menu对象

  1. 代码实现

       示例:
     @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        super.onCreateOptionsMenu(menu);
        getMenuInflater().inflate(R.menu.options_menu, menu);
        return true;
    }

复制代码 代码如下:

    布局文件:
      在res目录下建立一个menu文件夹,并创建布局文件:
options_menu.xml 
    <?xml version=”1.0″ encoding=”utf-8″?>
    <menu
xmlns:android=”;
    <item android:id=”@+id/menu_setting” android:title=”设置”
android:icon=”@drawable/setting”></item>
    </menu>

/**
  * 创建菜单
  */
 @Override
 public boolean onCreateOptionsMenu(Menu menu) {
  MenuInflater inflater = getMenuInflater();
  inflater.inflate(R.menu.meetting_contact_menu, menu);
  selectAllItem = menu.findItem(R.id.select_all_item);
  return true;
 }

   3.菜单项监听:
    只要菜单中的菜单项被点击,都会触发onOptionsItemSelected(MenuItem
item)
   
item参数即为被点击的菜单项,那么需要在此方法内判断哪个Item被点击了,从而实现不同的操作。
    对于两种不同的添加菜单方法,判断的方法有一点区别,但本质是一样的。

 // 当用户打开菜单的时候触发
 @Override
 public boolean onMenuOpened(int featureId, Menu menu) {
  if (menu != null) {
   refreshSelectAllItemIcon();
  }
  return super.onMenuOpened(featureId, menu);
 }

    3.1代码添加菜单的判断方法
     @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        super.onOptionsItemSelected(item);
        switch(item.getItemId())//得到被点击的item的itemId
        {
        case Menu.First+1: //对应的ID就是在add方法中所设定的Id
            break;
        case Menu.First+2:
            break;
        }
        return true;
    }

 /**
  * menu的点击事件
  */
 @Override
 public boolean onOptionsItemSelected(MenuItem item) {
  switch (item.getItemId()) {
  case R.id.select_all_item:
   if (isAllChecked) { // 反选
    item.setIcon(R.drawable.select_all_not);
    invertSelection();
   } else { // 全选
    if (contactList.size() == 0) {
     Toast.makeText(this, “目前没有可选的联系人”, Toast.LENGTH_SHORT)
       .show();
     break;
    }
    item.setIcon(R.drawable.select_all);
    selectAllContacts();
   }
   break;
  case R.id.delete_item: // 删除
   if (count == 0) {
    Toast.makeText(this, “您还没有选择任何联系人”,
Toast.LENGTH_SHORT).show();
    break;
   }
   showDeleteDialog(this, “您确定要删除吗”);
   isAllChecked = false;
   selectAllItem.setIcon(R.drawable.select_all_not);
   break;
  case R.id.sync_item:
   Intent fresh_intent = new Intent(this, CloudSyncActivity.class);
   if (flag) {// 如果是会议
    fresh_intent.putExtra(“number”, meetingNumber);
   }
   startActivityForResult(fresh_intent, CLOUD_SYNC);
   break;
  default:
   break;
  }
  return false;
 }

  3.2布局文件添加菜单的判断方法:
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        super.onOptionsItemSelected(item);
        switch(item.getItemId())//得到被点击的item的itemId
        {
       
case R.id.menu_setting://这里的Id就是布局文件中定义的Id,在用R.id.XXX的方法获取出来
            break;
        case R.id.menu_info:
            break;
        }
        return true;
    }

 // 刷新菜单项全选
 private void refreshSelectAllItemIcon() {
  for (String contactId : map_NumberSelected.keySet()) {
   if (!map_NumberSelected.get(contactId)) {
    isAllChecked = false;
    selectAllItem.setIcon(R.drawable.select_all_not);
    break;
   }
   isAllChecked = true;
   selectAllItem.setIcon(R.drawable.select_all);
  }
 }

提示删除的对话框

复制代码 代码如下:

/** 显示确认删除对话框 **/
 public void showDeleteDialog(Context context, String msg) {
  final Dialog dialog = new Dialog(context, R.style.MyDialog);
  View view =
LayoutInflater.from(context).inflate(R.layout.back_dialog,
    null);
  TextView msg_tv = (TextView) view.findViewById(R.id.msg);
  msg_tv.setText(msg);
  Button sure = (Button) view.findViewById(R.id.sure);
  Button cancle = (Button) view.findViewById(R.id.cancle);
  dialog.setContentView(view);
  sure.setOnClickListener(new OnClickListener() {
   @Override
   public void onClick(View v) {
    deleteContacts();
    dialog.dismiss();
   }
  });
  cancle.setOnClickListener(new OnClickListener() {

   @Override
   public void onClick(View v) {
    dialog.dismiss();
   }
  });
  dialog.show();
 }

下面是删除操作:
这里只关注实现删除的脉路,其中有些代码是业务逻辑需要可以稍微看一下就可以了

复制代码 代码如下:

 // 删除选中的联系人
 public void deleteContacts() {
  DialogHelp.getInstance().showHttpDialog(this,
R.string.wait_for_while,
    getString(R.string.deleting_contact));
  new Thread() {
   @Override
   public void run() {
    ArrayList<Contact> deleteContacts = new
ArrayList<Contact>();
    for (Contact contact : contactList) {
     boolean isselected = map_NumberSelected
       .get(contact.getId());
     if (isselected) {
      for (RawContact rawContact : rawList) {
       if (contact.getUserId() == rawContact.getUserId()) { //
是同一个id
        if (contact.getNumber() == rawContact
          .getPhone1()) {
         rawContact.setPhone1(null);
        } else if (contact.getNumber() == rawContact
          .getPhone2()) {
         rawContact.setPhone2(null);
        } else if (contact.getNumber() == rawContact
          .getTelephone()) {
         rawContact.setTelephone(null);
        }
        if ((rawContact.getPhone1() == null || “”
          .equals(rawContact.getPhone1()))
          && (rawContact.getPhone2() == null || “”
            .equals(rawContact.getPhone2()))
          && (rawContact.getTelephone() == null || “”
            .equals(rawContact
              .getTelephone()))) {
         MyDataBase.deleteContact(
           MeetingContactActivity.this,
           rawContact);
        } else {
         MyDataBase.updateContactById(
           MeetingContactActivity.this,
           rawContact);
        }
        break;
       }
      }
      // 将需要删除的联系人保存下来
      deleteContacts.add(contact);
     }
    }
    Message msg = new Message();
    msg.obj = deleteContacts;
    msg.what = DELETE_COMPLETE;
    handler.sendMessage(msg);
   };
  }.start();

 }

deleteContacts是用来保存需要删除的联系人,把它赋给msg.obj,再通过handler将消息放入消息队列,最终在handler的handleMessage方法进行删除操作。

handler处理代码:
这里把传递过来list在contactList遍历删除,然后在msg.what为DELETE_COMPLETE的分支进行通知列表刷新。

复制代码 代码如下:

private Handler handler = new Handler() {
  @Override
  public void handleMessage(Message msg) {
   if (msg.obj != null) {
    ArrayList<Contact> deleteContacts = (ArrayList<Contact>)
msg.obj;
    for (Contact contact : deleteContacts) {
     map_NumberSelected.remove(contact.getId());
     contactList.remove(contact);
    }
   }
   switch (msg.what) {
   case LOAD_CONTACT_FINISHED:
    // 判断是否为空
    if (contactList == null || contactList.size() == 0) {
     syncLayout.setVisibility(View.VISIBLE);
     bottomLayout.setVisibility(View.GONE);
     listView.setVisibility(View.GONE);
    } else {
     syncLayout.setVisibility(View.GONE);
     bottomLayout.setVisibility(View.VISIBLE);
     listView.setVisibility(View.VISIBLE);
    }
    adapter.setContactList(contactList);
    refreshList();
    DialogHelp.getInstance().dismissDialog();
    break;
   case CLOUD_SYNC: // 同步
    initContacts();
    refreshList();
    break;
   case SEARCH_FINISH:
    refreshList();
    break;
   case DELETE_COMPLETE: // 删除完毕
    DialogHelp.getInstance().dismissDialog();
    // 重新初始化
    refreshList();
    break;
   }
  }
 };

以上就是删除功能的全部实现了,关于通讯录模块开发博客可能会暂停更新,比如想字母索引,联系人分组等功能我还没去实现,以后有机会会继续分享。

您可能感兴趣的文章:

  • Android开发之自定义view实现通讯录列表A~Z字母提示效果【附demo源码下载】
  • Android保存联系人到通讯录的方法
  • Android编程实现通讯录中联系人的读取,查询,添加功能示例
  • Android自定义View实现通讯录字母索引(仿微信通讯录)
  • Android实现通讯录效果——获取手机号码和姓名
  • Android获取手机通讯录、sim卡联系人及调用拨号界面方法
  • 使用adb命令向Android模拟器中导入通讯录联系人的方法
  • Android实现仿通讯录侧边栏滑动SiderBar效果代码
  • Android手机联系人快速索引(手机通讯录)
  • Android跳转到通讯录获取用户名称和手机号码的实现思路
  • Android编程操作手机通讯录的方法示例

Post Author: admin

发表评论

电子邮件地址不会被公开。 必填项已用*标注