我們常常會遇到這種需求——在一個列表的一項上加上修改、刪除、標記等的操作,最常用的手法自然是長按這一項來彈出一個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中的位置,有此方法,我們的功能就能很方便地實現了。剩下的代碼就不貼了^_^因爲重點已經出來了~