我们常常会遇到这种需求——在一个列表的一项上加上修改、删除、标记等的操作,最常用的手法自然是长按这一项来弹出一个ContextMenu来提供这些功能了。但是有一个很重要的问题——如何获得当前列表上的位置呢?这个listview的contextMenu上的位置是一个比较隐蔽的属性,下面我通过一个小例子来说明。
首先,是这个Activity声明部分,这个很简单,就是一个ListView,然后给其注册一个ContextMenu。
public class PwdListActivity extends Activity implements OnClickListener {
private ListView listv;
private BaseAdapter adapter;
private List<account> accountlist;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_pwdlist);
listv = (ListView) findViewById(R.id.listview);
listv.setOnItemClickListener(new MonItemClickListener());
registerForContextMenu(listv);
}
然后我们要写这个ContextMenu的创建和点击方法。
@Override
public void onCreateContextMenu(ContextMenu menu, View v,
ContextMenuInfo menuInfo) {
getMenuInflater().inflate(R.menu.pwditem_menu, menu);
super.onCreateContextMenu(menu, v, menuInfo);
}
到这里都和普通的ContextMenu无异,下面是其选择方法——
@Override
public boolean onContextItemSelected(MenuItem item) {
int position=((AdapterContextMenuInfo) item.getMenuInfo()).position;
account acc=accountlist.get(position);
switch (item.getItemId()) {
case R.id.edit:
Intent inedit = new Intent(this, EditAccoutActivity.class);
inedit.putExtra("edit", acc.getId());
startActivity(inedit);
break;
case R.id.delete:
Builder builder = new AlertDialog.Builder(this);
builder.setTitle("确定删除?").setMessage("点击确定删除该账户信息")
.setPositiveButton("确定", new MPositiveOnClickListener(acc))
.setNegativeButton("取消", null);
builder.create().show();
break;
case R.id.viewpwd:
String shadow = acc.getShadow();
ToastUtils.show(PwdListActivity.this, AES.dec(shadow));
break;
default:
break;
}
return super.onContextItemSelected(item);
}
这个方法最重要的是方法体第一行,ListView上的MenuInfo可以通过强转成AdapterContextMenuInfo来提取其成员变量position,而这个position指示的正是当前item对应listview中的位置,有此方法,我们的功能就能很方便地实现了。剩下的代码就不贴了^_^因为重点已经出来了~