Прежде всего, мне интересно, не усложняете ли вы вещи с помощью View.setOnCreateContextMenuListener()
. Все становится намного проще, если вы используете Activity.registerForContextMenu()
, потому что тогда вы можете просто использовать Activity.onCreateContextMenu()
и Activity.onContextItemSelected()
для обработки всех событий вашего меню. Это в основном означает, что вам не нужно определять все эти анонимные внутренние классы для обработки каждого события; вам просто нужно переопределить несколько методов Activity для обработки этих событий контекстного меню.
Во-вторых, есть определенно более простые способы получить выбранный в данный момент элемент. Все, что вам нужно сделать, это сохранить ссылку либо на ListView
, либо на Adapter
, использованный для его заполнения. Вы можете использовать ContextMenuInfo как AdapterContextMenuInfo, чтобы получить позицию элемента; и затем вы можете использовать ListView.getItemAtPosition()
или Adapter.getItem()
, чтобы получить Object
, конкретно связанный с тем, на что был нажат. Например, предположим, что я использую Activity.onCreateContextMenu()
, я мог бы сделать это:
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);
// Get the info on which item was selected
AdapterContextMenuInfo info = (AdapterContextMenuInfo) menuInfo;
// Get the Adapter behind your ListView (this assumes you're using
// a ListActivity; if you're not, you'll have to store the Adapter yourself
// in some way that can be accessed here.)
Adapter adapter = getListAdapter();
// Retrieve the item that was clicked on
Object item = adapter.getItem(info.position);
}
@Override
public boolean onContextItemSelected(MenuItem item) {
// Here's how you can get the correct item in onContextItemSelected()
AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();
Object item = getListAdapter().getItem(info.position);
}