OnCreateContextMenu和ListView项

时间:2012-09-12 13:22:11

标签: android arraylist android-listview contextmenu

我有一个带有几个项目的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();
    }
});

很明显,选择一个entriy会显示该条目对象的元素,在本例中是所选Item对象的ID(不是列表ID,而是创建ArrayList项时设置的对象ID)。这很好用,让我可以用选定的项目做任何我想做的事。

现在我想要一个“长按”监听器,打开所选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不同的参数,如何在OnItemClickListener中访问ArrayList的元素?

6 个答案:

答案 0 :(得分:13)

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

考虑这个用于处理列表:

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

答案 1 :(得分:6)

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;
   }
});

这将帮助您在一行中实现长时间的操作。

答案 2 :(得分:5)

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

convertView.setOnLongClickListener(new OnLongClickListener() {

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

这样,单击视图和长按上下文菜单都可以在listview行项目上使用。

答案 3 :(得分:4)

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

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");  
}

您实际上不需要在列表视图中使用longClickListener来使用ContextMenu。

希望它会对你有所帮助。

答案 4 :(得分:2)

我将让您通过以下编写的示例,通过使用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);
    }
}

希望这会有所帮助......

答案 5 :(得分:0)

尝试使用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项目