2011-09-03 104 views
3

我试图通过这本书从Android开发文档这样做:几乎完全为http://developer.android.com/guide/topics/ui/menus.html#context-menuAdapterContextMenuInfo总是空

// 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

这里是它的外观的文档(和我的代码):

@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(); 
    ... 
} 

是真正独特的唯一事情是我有一个列表项目的自定义布局(即几个文本字段和图像)。有什么我需要做的是能够获得上下文菜单的内置项目的索引?

+0

你说onCreateContextMenu是“几乎”一模一样,什么区别?你可以发布该方法吗? – Jack

+0

该方法与文档中的完全相同。 – leech

+0

无论如何贴吧...... – Jack

回答

4

您需要在ListView的活动中调用registerForContextMenu(),而不是在适配器中查看项目。

+3

recyclerview的似乎没有这样的。你知道的任何解决方法? – eipipuz

4

getMenuInfo()可以工作在ListAdapter,而不是意见。

但是,您可以将其他数据与视图的标记一起传递。

在getView

:vi.setTag(位置)activity.registerForContextMenu(ⅵ);

在Activity中声明private int id;

onCreateContextMenu:ID =(int)的v.getTag();

onContextItemSelected:你可以使用id