在列表视图上长按事件后创建菜单

Posted

技术标签:

【中文标题】在列表视图上长按事件后创建菜单【英文标题】:creating a menu after a long click event on a list view 【发布时间】:2013-06-16 22:32:54 【问题描述】:

我有一个连接到数据库的列表视图,显示所有条目。如果用户长按列表视图(数据库条目)中的项目,我希望显示一个菜单,显示编辑或删除条目的选项。我怎样才能做到这一点。

到目前为止,我已经尝试使用 onItemLongClick 侦听器和其中的 toast 来显示长按视图的 id。

@Override
public boolean onItemLongClick(AdapterView<?> parent, View view,
        int position, long id) 

    String res = Long.toString(id);
     Toast toast = Toast.makeText(this, res, Toast.LENGTH_SHORT);
     toast.show();

    return true;

【问题讨论】:

【参考方案1】:

首先您需要在列表视图中注册上下文菜单。

lv = (ListView) findViewById(R.id.list_view);
registerForContextMenu(lv);

然后,只需覆盖活动方法。

/**
 * MENU
 */

@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) 
      super.onCreateContextMenu(menu, v, menuInfo);
      if (v.getId()==R.id.list_view) 
          MenuInflater inflater = getMenuInflater();
          inflater.inflate(R.menu.menu_list, menu);
      


@Override
public boolean onContextItemSelected(MenuItem item) 
      AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();
      switch(item.getItemId()) 
         case R.id.add:
         // add stuff here
            return true;
          case R.id.edit:
            // edit stuff here
                return true;
          case R.id.delete:
        // remove stuff here
                return true;
          default:
                return super.onContextItemSelected(item);
      

这里是 menu_list.xml 文件的示例(您必须将文件放在 res/menu 文件夹中)。

<?xml version="1.0" encoding="utf-8"?>
<menu
  xmlns:android="http://schemas.android.com/apk/res/android">

       <item android:id="@+id/add"
              android:icon="@android:drawable/ic_menu_add"
              android:title="@string/menu_add" />

      <item android:id="@+id/edit"
              android:icon="@android:drawable/ic_menu_edit"
              android:title="@string/menu_edit" />

       <item android:id="@+id/delete"
            android:icon="@android:drawable/my_icon_delete"
             android:title="@string/menu_delete" />

</menu>

希望它会有所帮助。

【讨论】:

谢谢,它可以工作,但我怎么知道列表中的哪个项目被长按了?有身份证吗? 好的,我找到了。您可以像这样获取长按列表项的 ID 或 POSITION:((AdapterView.AdapterContextMenuInfo)menuInfo).id((AdapterView.AdapterContextMenuInfo)menuInfo).position switch 语句不再起作用,因为 R.id.add 等值不再作为常量生成。因此我需要用 if-else stmt 替换 switch! 很好的例子,但上下文菜单中不支持图标 嘿,您确实为菜单设置了图标,但菜单中没有图标。为什么?如何显示图标?【参考方案2】:

你可以使用 onItemLongClick 而不是使用

public void onCreateContextMenu(final ContextMenu menu, 
                    final View v, final ContextMenuInfo menuInfo) 
 ...

您在哪里设置编辑和删除选项或任何您需要的选项。

从上下文菜单中选择的项目的动作可以在

中处理
public boolean onContextItemSelected(final MenuItem item)

有关上下文菜单的更多信息,请参阅here。

如需分步教程,请访问here。

编辑 第二个链接已损坏,因为它很旧。 但我想您可以参考其他投票率很高的答案之一来查看所涉及的所有步骤,

【讨论】:

我尝试使用 oncreateContextMenu,直到现在它都对我有用。谢谢 它已经很老了。我放的时候正在工作。谢谢指点。【参考方案3】:

另一种方法:

//Deleted individual cart items
    //on list view cell long press
    cartItemList.setOnItemLongClickListener (new OnItemLongClickListener() 
          @SuppressWarnings("rawtypes")
        public boolean onItemLongClick(AdapterView parent, View view, final int position, long id) 
              final CharSequence[] items =  "Delete" ;

                AlertDialog.Builder builder = new AlertDialog.Builder(context);

                builder.setTitle("Action:");
                builder.setItems(items, new DialogInterface.OnClickListener() 

                    public void onClick(DialogInterface dialog, int item) 
                        cart = cartList.get(position);
                        db.removeProductFromCart(context, cart);

                        new AlertDialog.Builder(context)
                        .setTitle(getString(R.string.success))
                        .setMessage(getString(R.string.item_removed))
                        .setPositiveButton("Done", new DialogInterface.OnClickListener() 
                            public void onClick(DialogInterface dialog, int which)  
                                Intent intent = new Intent(CartDetailsActivity.this, HomeScreen.class);
                                startActivity(intent);
                            
                         )
                         .show();

                    

                );

                AlertDialog alert = builder.create();

                alert.show();
            //do your stuff here
              return false;
          
        );

【讨论】:

【参考方案4】:

你可以在你的点击项方法中调用Activity.openOptionsMenu()

在这里查看http://developer.android.com/reference/android/app/Activity.html#openOptionsMenu%28%29

【讨论】:

如果您可以使用选项菜单 - 这是一个不错的解决方案(1 行!),并且可以替代在活动中执行 contextMenu 所需的所有设置【参考方案5】:

**

在列表视图上注册上下文菜单后

** 像这样覆盖 onCreateContextMenu 方法

@Override
    public void onCreateContextMenu(ContextMenu menu,View v, ContextMenu.ContextMenuInfo menuInfo)
        if (v.getId() == R.id.listView)
            AdapterView.AdapterContextMenuInfo info =(AdapterView.AdapterContextMenuInfo)menuInfo;
            MenuItem mnu1=menu.add(0,0,0,"Delete");
            MenuItem mnu2=menu.add(0,1,1,"Share");
        
    

然后为每个可以选择的项目编码

 @Override
    public boolean onContextItemSelected(MenuItem menuItem)
        AdapterView.AdapterContextMenuInfo info=(AdapterView.AdapterContextMenuInfo)menuItem.getMenuInfo();
        switch (menuItem.getItemId()) 
            case 0:
                Toast.makeText(this, "Delete Selected", Toast.LENGTH_LONG).show();
                break;
            case 1:
                Toast.makeText(this, "Share Selected", Toast.LENGTH_LONG).show();
                break;

            default:
                break;

        
        return true;
    

【讨论】:

【参考方案6】:

使用 registerForContextMenu();将上下文菜单链接到任何视图后继者。

要访问选定的 ListItem 数据,只需使用 AdapterView.AdapterContextMenuInfo。 例如:

@Override
public boolean onContextItemSelected(MenuItem item) 
    AdapterView.AdapterContextMenuInfo menuinfo = (AdapterView.AdapterContextMenuInfo)item.getMenuInfo();
    long selectid = menuinfo.id; //_id from database in this case
    int selectpos = menuinfo.position; //position in the adapter
    switch (item.getItemId()) 
    case 1:
        doSomething(selectid);
    break;
    case 2:
        doSomethingElse(selectpos);
    
    return super.onContextItemSelected(item);

【讨论】:

【参考方案7】:

对于那些仍在苦苦挣扎的人来说,有两种方法

registerForContextMenu(list);
unregisterForContextMenu(list);

确保你选择第一个。

【讨论】:

以上是关于在列表视图上长按事件后创建菜单的主要内容,如果未能解决你的问题,请参考以下文章

Android listview - 长按显示错误的上下文菜单

在tableview自定义单元格中的图像上长按手势

如何在列表视图上触发正确的 Longclick 事件

如何检测任何视图的长按位置?

通过上下文菜单删除后刷新自定义列表视图

长按刷新列表后取消ListView上的点击事件