AdapterContextMenuInfo始终为空。

4

我尝试按照Android开发文档的指导进行操作:

// this didn't create a menu, i don't know why
//registerForContextMenu(getListView());

setListAdapter(new ArrayAdapter<Note>(this, R.layout.selectset_listitem) {
    @Override

    protected View getView(...) {
        ... custom layout ...

        // this creates a menu, but...
        registerForContextMenu(convertView);

        return convertView;
    }
}

而且 onCreateContextMenuonContextItemSelected 几乎与http://developer.android.com/guide/topics/ui/menus.html#context-menu中的一样。

这是它在文档(和我的代码)中的样子:

@Override
public void onCreateContextMenu(ContextMenu menu, View v,
                                ContextMenuInfo menuInfo) {
  super.onCreateContextMenu(menu, v, menuInfo);
  MenuInflater inflater = getMenuInflater();
  inflater.inflate(R.menu.context_menu, menu);
}

但是这部分总是给我一个空信息:
public boolean onContextItemSelected(MenuItem item) {
    AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();
    ...
}

唯一独特的是我有一个自定义的列表项布局(即几个文本字段和一张图片)。我需要做什么才能获得上下文菜单所建立的列表项的索引呢?


你说onCreateContextMenu“几乎”完全相同,有什么区别吗?你能发一下那个方法吗? - Jack
你为什么注释掉了registerForContextMenu()?它并不会“创建”菜单,只是将你的列表视图注册为长按事件的监听器,并调用onCreateContextMenu。如果你不注册registerForContextMenu,那么很可能onCreateContextMenu将无法正常工作。 - Jack
好的,现在当您调试并进入onContextItemSelected时会发生什么?另外,您是否使用自定义适配器?如果是,请发布代码。 - Jack
将调试信息转储到onContextItemSelected:info设置为null。我更新了问题以包括我的ArrayAdapter。 - leech
让我们在聊天中继续这个讨论:http://chat.stackoverflow.com/rooms/3139/discussion-between-leech-and-jack - leech
显示剩余2条评论
2个回答

5

您需要在活动中调用 registerForContextMenu(),而不是在适配器中的视图项上调用。

该方法与ListView相关。请注意,不要修改HTML标记。

4
RecyclerView似乎不能以那种方式工作。您知道任何解决方法吗? - eipipuz
如何为RecyclerView创建上下文菜单 - B-GangsteR

4

getMenuInfo() 适用于 ListAdapter,而不是视图。

但是,您可以通过视图的标签传递附加数据。

getView: vi.setTag(position) activity.registerForContextMenu(vi);

declare in Activity private int id;

onCreateContextMenu: id = (int) v.getTag();

onContextItemSelected:

您可以使用ID。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接