Android OnCreateContextMenu和ListView项

Android OnCreateContextMenu和ListView项,android,arraylist,android-listview,contextmenu,Android,Arraylist,Android Listview,Contextmenu,我有一个包含多个项目的LisView。为此,我连接了一个McClickListener(作为内部类),如下所示: lv.setOnItemClickListener(new OnItemClickListener() { public void onItemClick(AdapterView<?> parent, View view, int position, long id) { Toast.makeText(ShoppingListApp02Activity.t

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

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

由于OnCreateContextMenu采用的参数与OnItemClickListener不同,因此如何像在OnItemClickListener中一样访问ArrayList的元素?

而不是与上下文菜单(在广泛的上下文中使用,如在PC中单击鼠标右键),
ListView
提供了onimlongclick事件,更易于实现。例如:

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

        return false;
   }
});
lv.setOnItemLongClickListener(新的OnItemLongClickListener(){
@凌驾
长单击(AdapterView arg0、视图arg1、int arg2、,
长arg3){
//TODO自动生成的方法存根
返回false;
}
});

这将帮助您在行上实现长按操作。

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

convertView.setOnLongClickListener(new OnLongClickListener() {

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

这样,单击视图和长按上下文菜单都会对listview行项目起作用。

首先将上下文菜单注册到listview中以打开上下文菜单:

registerForContextMenu(YOUR LIST-VIEW OBJECT);
然后可以使用onCreateContextMenu()方法:

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


希望它能对您有所帮助。

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

使用列表时请考虑以下情况:

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

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


希望这有帮助…

在recycleView中尝试查看项目

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项目的数据一起使用,这样更好。但是长时间单击时如何显示菜单或类似菜单?只需使用带有
ArrayAdapter
DialogInterface的
AlertDialog
。OnClickListener
弹出自定义菜单问题是长时间单击时列表项不会突出显示。使用上下文菜单时,它工作正常。@Xdg使用这种方法,ListView项应该高亮显示。确保您没有通过style/theme.Uhm覆盖突出显示逻辑。我差不多就是这么做的,不是吗?我仍然无法访问OnCreateContextMenu中ListView的ArrayList。是的,为此,您需要声明您的ListView和适配器在整个活动中都是可访问的。它可能有助于解决您的问题。它将在onLongClick中以视图的形式返回ListView,而不是项目的视图。我的意思是在从getView()方法返回的视图上设置longclick侦听器。这就是为什么我将其称为convertview。然后,您需要使用
setOnItemLongClickListener
,它将返回从getView()生成的视图。i、 e.行项确实是一种智能方式这似乎是最简单的解决方案。如何将位置传递给
onContextItemSelected
-处理程序?最简单的方法是在创建菜单(onCreateContextMenu)时,将位置/项存储在类成员中(例如:mcontextMenuPosition/mContextMenuForItem). 由于onCreateContextMenu总是在onContextItemSelected之前调用,因此可以确保成员将具有有效值。@maja``@覆盖公共布尔onContextItemSelected(MenuItem项){AdapterContextMenuInfo=(AdapterContextMenuInfo)项。getMenuInfo();int position=info.position;…}```
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);
    ...
}
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);
    }
}
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;
                }
            });
        }
    });