Android 获取ListView中的选定项

Android 获取ListView中的选定项,android,Android,我有一个列表视图,在长时间单击时显示菜单。在onContextItemSelected中,我有一个逻辑来处理该操作。我需要知道ListView中选择了什么项目 如果用户选择的项不是子菜单,我可以使用MenuItem.getMenuInfo() 但如果用户选择子菜单,MenuItem.getMenuInfo()将返回null 如果有子菜单,如何正确确定所选项目 菜单: <?xml version="1.0" encoding="utf-8"?> <menu xmlns:and

我有一个列表视图,在长时间单击时显示菜单。在onContextItemSelected中,我有一个逻辑来处理该操作。我需要知道ListView中选择了什么项目

  • 如果用户选择的项不是子菜单,我可以使用MenuItem.getMenuInfo()
  • 但如果用户选择子菜单,MenuItem.getMenuInfo()将返回null
如果有子菜单,如何正确确定所选项目

菜单:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:id="@+id/Edit" android:title="Edit" />
    <item android:id="@+id/Settings" android:title="Settings">
        <menu>
            <item android:id="@+id/V1" android:title="V1" />
        ...
        </menu>
    </item>
</menu>

...
onContextItemSelected:

 @Override
 public boolean onContextItemSelected(MenuItem Item) {
  AdapterView.AdapterContextMenuInfo AdapterInfo = (AdapterView.AdapterContextMenuInfo)Item.getMenuInfo(); // getMenuInfo returns null if V1 is selected (submenu) but works if selected item isn't submenu, e.g., 'Edit' as per above XML
  UserItem SelectedItem = MyAdapter.getItem(AdapterInfo.position); // MyAdapter is the instance of class that inherits from ArrayAdapter<UserItem> i.e. adapter for ListView
 }
@覆盖
公共布尔值onContextItemSelected(MenuItem项){
AdapterView.AdapterContextMenuInfo AdapterInfo=(AdapterView.AdapterContextMenuInfo)项。getMenuInfo();//如果选择了V1(子菜单),getMenuInfo将返回null,但如果所选项不是子菜单,则会起作用,例如,按照上述XML进行“编辑”
UserItem SelectedItem=MyAdapter.getItem(AdapterInfo.position);//MyAdapter是从ArrayAdapter继承的类的实例,即ListView的适配器
}

为什么不对listview中的所有项目使用
onItemClickLitener()
,而不在munu项目和子菜单项目上进行划分

 listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {

            String s = listView.getItemAtPosition(i).toString();
            }
    });

你需要做三件事

1.在switch语句中提供处理菜单项的默认部分

2.将info.position保存到活动中的成员变量

3.当您检测到信息为空时,请使用您在步骤2中创建的var

private int mParentContextMenuListIndex;

@Override
public boolean onContextItemSelected(MenuItem item) {
    AdapterView.AdapterContextMenuInfo info;
    try {
        info = (AdapterView.AdapterContextMenuInfo) item.getMenuInfo();
    } catch (ClassCastException e) {
        Log.e(TAG, "bad menuInfo", e);
        return false;
    }
    //if info == null, it means we have a submenu to deal with, use the saved info.position
    int idxOfList = (info!=null) ? info.position : this.mParentContextMenuListIndex;
    ...
    switch (item.getItemId()) {
        case R.id.context_menu_item_1:
            ... //use idxOfList instead of info.position
            return true;
        case R.id.context_menu_item_2:
            ... //use idxOfList instead of info.position
            return true;
        case R.id.context_menu_item_3:
            ... //use idxOfList instead of info.position
            return true;
        case R.id.context_submenu_item_1:
            ... //use idxOfList instead of info.position
            return true;
        case R.id.context_submenu_item_2:
            ... //use idxOfList instead of info.position
            return true;
        default: //can handle submenus if we save off info.position
            this.mParentContextMenuListIndex = idxOfList;
    }//switch
    return super.onContextItemSelected(item);
}

谢谢你的回答。当我尝试setOnItemClickListener时,它没有启动。如果列表项是可聚焦和可单击的,或者它作为子项具有可聚焦和可单击的视图,则单击式侦听器不起作用。使项目视图不可聚焦可以解决此问题。将这些属性设置为false everywhere
private int mParentContextMenuListIndex;

@Override
public boolean onContextItemSelected(MenuItem item) {
    AdapterView.AdapterContextMenuInfo info;
    try {
        info = (AdapterView.AdapterContextMenuInfo) item.getMenuInfo();
    } catch (ClassCastException e) {
        Log.e(TAG, "bad menuInfo", e);
        return false;
    }
    //if info == null, it means we have a submenu to deal with, use the saved info.position
    int idxOfList = (info!=null) ? info.position : this.mParentContextMenuListIndex;
    ...
    switch (item.getItemId()) {
        case R.id.context_menu_item_1:
            ... //use idxOfList instead of info.position
            return true;
        case R.id.context_menu_item_2:
            ... //use idxOfList instead of info.position
            return true;
        case R.id.context_menu_item_3:
            ... //use idxOfList instead of info.position
            return true;
        case R.id.context_submenu_item_1:
            ... //use idxOfList instead of info.position
            return true;
        case R.id.context_submenu_item_2:
            ... //use idxOfList instead of info.position
            return true;
        default: //can handle submenus if we save off info.position
            this.mParentContextMenuListIndex = idxOfList;
    }//switch
    return super.onContextItemSelected(item);
}