OnCreateContextMenu and ListView items



我有一个包含多个项目的LisView。为此,我连接了一个OnItemClickListener(作为内部类),如下所示:

lv.setOnItemClickListener(new OnItemClickListener() {
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
    Toast.makeText(ShoppingListApp02Activity.this, "List item selected:" +  
    items.get(position).getId(), Toast.LENGTH_LONG).show();
    }
});

很明显,选择entry会显示该条目的对象元素,在本例中是所选Item对象的ID(不是列表ID,而是创建ArrayList项目时设置的对象ID)。这很好地工作,并且使我能够对所选项目执行任何我想要的操作。

现在,我还希望有一个"长点击"监听器her,它为所选ListView项打开一个上下文菜单。我该怎么做?我已经能够将onCreateContextMenu侦听器附加到ListView,但我不知道如何像使用onItemClickListener那样获得ArrayList的元素?

这是我得到的:

public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {  
    menu.add(0, v.getId(), 0, "Something");
    menu.add(0, v.getId(), 0, "Something else");  
}

由于OnCreateConextMenu采用的参数与OnItemClickListener不同,我如何访问ArrayList的元素,如OnItemClick监听器中的元素?

如果您决定仍要使用上下文菜单范例:

在处理列表时考虑这一点:

public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {  
    // Get the list
    ListView list = (ListView)v;
    // Get the list item position    
    AdapterContextMenuInfo info = (AdapterContextMenuInfo)menuInfo;
    int position = info.position
    // Now you can do whatever.. (Example, load different menus for different items)
    list.getItem(position);
    ...
}

ListView提供了更易于实现的onItemLongClick事件,而不是扰乱上下文菜单(在宽上下文中使用,如在PC中右键单击)。例如:

lv.setOnItemLongClickListener(new OnItemLongClickListener() {
   @Override
   public boolean onItemLongClick(AdapterView<?> arg0, View arg1, int arg2,
       long arg3) {
        // TODO Auto-generated method stub
        return false;
   }
});

这将帮助您在一行中完成长时间按下的操作。

在行视图上长按事件的事件处理程序中打开视图的上下文菜单。

convertView.setOnLongClickListener(new OnLongClickListener() {
            @Override
            public boolean onLongClick(View v) {
                ((Activity)mContext).openContextMenu(v);
                return true;
            }
        });

这样,单击视图和长按上下文菜单都可以在列表视图行项目上工作。

首先将上下文菜单注册到列表视图中以打开上下文菜单:

registerForContextMenu(YOUR LIST-VIEW OBJECT);

然后可以使用onCreateContextMenu()方法:

public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {  
    menu.add(0, v.getId(), 0, "Something");
    menu.add(0, v.getId(), 0, "Something else");  
}

实际上,您不需要在listview中使用longClickListener来使用ContextMenu。

希望它能帮助你。

我将让您浏览下面编写的示例,并了解如何使用onContextItemSelected()实现它

public void onCreateContextMenu(ContextMenu menu,
        View v,
        ContextMenuInfo menuInfo) {
    super.onCreateContextMenu(menu, v, menuInfo);

    menu.setHeaderTitle(title);
    menu.add(0, CMD_EDIT, 0, R.string.context_menu_edit);
    menu.add(0, CMD_DELETE, 0, R.string.context_menu_delete);

}
@Override
public boolean onContextItemSelected(MenuItem item) {
    switch (item.getItemId()) {
    case CMD_EDIT:
        any_function();//add your functionality here i.e. what you want to do
        return true;
    case CMD_DELETE:
        **confirmDelete**();
        return true;
    default:
        return super.onContextItemSelected(item);
    }
}

希望这能帮助。。。

在recycleView 中的View项目中尝试此操作

viewForContextMenu.setOnCreateContextMenuListener(new View.OnCreateContextMenuListener() {
        @Override
        public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
            menu.add("Context Menu Item1").setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
                @Override
                public boolean onMenuItemClick(MenuItem item) {
                    //What should happent on selecting context menu item 1
                    return true;
                }
            });
        }
    });

您可以将其与ViewHolder项的设置数据一起使用

最新更新