第一步:定义上下文菜单监听器
//定义监听器 private final OnCreateContextMenuListener mCreateContextMenuListener = new OnCreateContextMenuListener() { @Override public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) { // TODO Auto-generated method stub menu.add(0, 0, 0, "修改"); menu.add(0, 1, 0, "删除"); } };
里面设置了两个菜单 一个是修改 一个是删除
备注:menu.add()函数的四个参数(内容来自网络)
第一个int类型的group ID参数,代表的是组概念,你可以将几个菜单项归为一组,以便更好的以组的方式管理你的菜单按钮。
第二个int类型的item ID参数,代表的是项目编号。这个参数非常重要,一个item ID对应一个menu中的选项。在后面使用菜单的时候,就靠这个item ID来判断你使用的是哪个选项
第三个int类型的order ID参数,代表的是菜单项的显示顺序。默认是0,表示菜单的显示顺序就是按照add的显示顺序来显示。
第四个String类型的title参数,表示选项中显示的文字。
第二步:为Listview设置上下文菜单监听器
listView.setOnCreateContextMenuListener(mCreateContextMenuListener);
第三步:重写响应方法,响应上下文菜单
//响应上下文菜单 @Override public boolean onContextItemSelected(MenuItem item) {
下面贴一个activity的完整代码:功能为长按ListView条目,出现修改和删除两个菜单,点击每个菜单有不同的操作
package com.sr.my; import java.util.ArrayList; import java.util.List; import cn.bmob.v3.BmobQuery; import cn.bmob.v3.listener.DeleteListener; import cn.bmob.v3.listener.FindListener; import cn.bmob.v3.listener.SaveListener; import cn.bmob.v3.util.i; import com.sr.code.Code; import com.sr.code.CodeMyAdapter; import com.sr.code.CodeShow; import com.sr.mytest.CodeList; import com.sr.mytest.R; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.provider.ContactsContract.CommonDataKinds.Identity; import android.util.Log; import android.view.ContextMenu; import android.view.MenuItem; import android.view.View; import android.view.Window; import android.view.ContextMenu.ContextMenuInfo; import android.view.View.OnCreateContextMenuListener; import android.widget.AdapterView; import android.widget.ListView; import android.widget.TextView; import android.widget.AdapterView.OnItemClickListener; import android.widget.Toast; public class MyPersonalCode extends BaseActivity { private String ID = "FAILD"; private CodeMyAdapter codeMyAdapter; private List<Code>itemBeanList; //定义监听器 private final OnCreateContextMenuListener mCreateContextMenuListener = new OnCreateContextMenuListener() { @Override public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) { // TODO Auto-generated method stub menu.add(0, 0, 0, "修改"); menu.add(0, 1, 0, "删除"); } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); this.requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.code_list); itemBeanList = new ArrayList<Code>(); final MyUser myUser = MyUser.getCurrentUser(MyPersonalCode.this, MyUser.class); //查询当前用户所有的所有条目 BmobQuery<MyCode>query = new BmobQuery<MyCode>(); query.addWhereEqualTo("username", myUser.getUsername()); Log.d("AAA", "t"+myUser.getUsername()); query.findObjects(this, new FindListener<MyCode>() { @Override public void onSuccess(List<MyCode> object) { // TODO Auto-generated method stub Log.d("B", "t"+object.size()); for(MyCode code : object){ Code newCode = new Code(); newCode.setTitle(code.getUsertitle()); newCode.setContent(code.getUsercode()); Log.d("B", "t"+code.getUsertitle()); Log.d("B", "t"+code.getUsercode()); itemBeanList.add(newCode); } ListView listView = (ListView) findViewById(R.id.lv_main); codeMyAdapter = new CodeMyAdapter(MyPersonalCode.this, itemBeanList); listView.setAdapter(codeMyAdapter);//第一个参数为context,第二个是数据源 listView.setOnCreateContextMenuListener(mCreateContextMenuListener); listView.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> listView, View v, int position, //怎样获取这个对象? long id) { // TODO Auto-generated method stub Intent i = new Intent(MyPersonalCode.this, CodeShow.class); Code code= (Code) listView.getItemAtPosition(position); //Log.d("SR", code.getTitle()); i.putExtra(CodeShow.EXTRA_TEXT, code.getTitle()); i.putExtra(CodeShow.EXTRA_CONTENT, code.getContent()); i.putExtra(CodeShow.FROM_WHERE, true); startActivity(i); } }); } @Override public void onError(int arg0, String arg1) { // TODO Auto-generated method stub } }); } //响应上下文菜单 @Override public boolean onContextItemSelected(MenuItem item) { // TODO Auto-generated method stub final MenuItem itemid = item; //寻找到对应item的相应对象Code AdapterView.AdapterContextMenuInfo menuInfo = (AdapterView.AdapterContextMenuInfo) item.getMenuInfo(); final String title = ((TextView)menuInfo.targetView.findViewById(R.id.code3_title)).getText().toString(); final String content = ((TextView)menuInfo.targetView.findViewById(R.id.code3_content)).getText().toString(); final MyUser myUser = MyUser.getCurrentUser(MyPersonalCode.this, MyUser.class); //先查询那个objectID,然后再根据objectID在服务器端删除 BmobQuery<MyCode>query = new BmobQuery<MyCode>(); query.addWhereEqualTo("username", myUser.getUsername()); query.addWhereEqualTo("usertitle", title); query.addWhereEqualTo("usercode", content); query.findObjects(MyPersonalCode.this, new FindListener<MyCode>() {//查询ID @Override public void onError(int arg0, String arg1) { // TODO Auto-generated method stub } @Override public void onSuccess(List<MyCode> C) { // TODO Auto-generated method stub for(MyCode code : C){ ID = code.getObjectId(); break; } switch (itemid.getItemId()) { case 1: //数据集里删除code数据,因为后面点击删除以后要自动更新视图列表 for(Code code : itemBeanList){ if(code.getTitle() == title && code.getContent() == content) { itemBeanList.remove(code); break; } } //根据ID进行删除 MyCode myCode = new MyCode(); myCode.setObjectId(ID); myCode.delete(MyPersonalCode.this, new DeleteListener() { @Override public void onSuccess() { // TODO Auto-generated method stub codeMyAdapter.notifyDataSetChanged();//数据源更新,使得删除后视图列表更新 toast("删除成功"); } @Override public void onFailure(int arg0, String msg) { // TODO Auto-generated method stub toast("删除失败" + msg); } }); break; case 0://去修改 boolean toEdit = true; Intent intent = new Intent(MyPersonalCode.this, MyCodeAdd.class); intent.putExtra(MyCodeAdd.EDIT_IS, toEdit); intent.putExtra(MyCodeAdd.EDIT_ID, ID); intent.putExtra(MyCodeAdd.EDIT_CONTENT, content); intent.putExtra(MyCodeAdd.EDIT_TITLE, title); startActivity(intent); break; }//switch }//onsuccess });//findObjects return false; }//item }