6

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

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

现在我还想给她一个“长按”监听器,它会为选定的 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 的元素?

4

6 回答 6

14

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

考虑使用列表:

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);
    ...
}
于 2013-02-06T10:52:56.090 回答
7

而不是弄乱上下文菜单(在广泛的上下文中使用 - 如在 PC 中的右键单击),ListView提供更容易实现的onItemLongClick事件。例如:

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

        return false;
   }
});

这将帮助您连续完成长按操作。

于 2012-09-12T13:27:08.037 回答
5

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

convertView.setOnLongClickListener(new OnLongClickListener() {

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

这样,单击视图和长按上下文菜单都适用于列表视图行项目。

于 2012-09-12T13:42:26.673 回答
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。

希望它会帮助你。

于 2012-09-12T13:46:25.860 回答
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);
    }
}

希望这可以帮助...

于 2013-06-01T12:34:31.540 回答
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 项目一起使用

于 2015-11-11T13:56:01.513 回答