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

Posted

技术标签:

【中文标题】Android listview - 长按显示错误的上下文菜单【英文标题】:Android listview - on long click shows wrong contextmenu 【发布时间】:2013-11-06 12:23:54 【问题描述】:

我有两个列表视图,书签列表视图和历史列表视图,一个在 另一个之上。当 historylistview 时 Bookmarklistview 被隐藏 显示,反之亦然。对于长点击事件,我正在创建一个 上下文菜单。长点击事件与 historylistview 配合得很好。

现在当我长按书签列表视图中的项目时出现问题, 显示历史列表视图上下文菜单而不是书签列表视图 上下文菜单。

怎么会这样?有什么想法吗?

以下是书签列表视图上下文菜单的代码

public void onCreateContextMenuBookmark(ContextMenu menu, View v, ContextMenuInfo menuInfo)
    super.onCreateContextMenu(menu, v, menuInfo);
    menu.setHeaderTitle("Delete Bookmark?");
    menu.add(1, 1, 1, "Delete");
    menu.add(1, 2, 2, "Cancel");


public boolean onContextItemSelectedBookmark(MenuItem item)
    AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();

    if(item.getTitle() == "Delete")
    //  delete item
    else if(item.getTitle() == "Cancel")
    
    return false;

下面是historylistview上下文菜单的代码

public void onCreateContextMenuHistory(ContextMenu menu, View v, ContextMenuInfo menuInfo)
    super.onCreateContextMenu(menu, v, menuInfo);
    menu.setHeaderTitle("Delete History?");
    menu.add(1, 1, 1, "Delete");
    menu.add(1, 2, 2, "Cancel");


@Override
public boolean onContextItemSelected(MenuItem item)
    AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();

    if(item.getTitle() == "Delete")
        //     delete item
    else if(item.getTitle() == "Cancel")
    
    return false;

好的,我发现我可以为两个视图使用一个上下文菜单,就像这样

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

    super.onCreateContextMenu(menu, v, menuInfo);
    switch(v.getId())
    case R.id.history_listView:
        menu.setHeaderTitle("Delete History?");
        menu.add(0, v.getId(), 0, "Delete");
        menu.add(0, v.getId(), 0, "Cancel");
        break;

    case R.id.bookmark_listView:
        menu.setHeaderTitle("Delete Bookmark?");
        menu.add(0, v.getId(), 0, "Delete");
        menu.add(0, v.getId(), 0, "Cancel");
    

但是如何为每个视图调用两个不同的 onContextItemSelected() 方法呢?

【问题讨论】:

应该有item.getTitle().equals("Delete") 而不是item.getTitle() == "Delete" 您是否一次只显示一个列表视图。如果是这样,那么出于隐藏目的,您应该使用 View.GONE 而不是 View.INVISIBLE @ChintanRathod 但是同样的代码可以在 historylistview 上正常工作。 @BharatSharma 好吧,我使用的是 View.INVISIBLE,但将其更改为 View.GONE 也有帮助。 【参考方案1】:

你能不能试试这个方法

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

    if(v.getId() == R.id.cover)

    menu.setHeaderTitle("Change Cover");
    menu.add(0, v.getId(), 0, "Take Photo");
    menu.add(0, v.getId(), 0, "Choose From Library");
    
    else if(v.getId() == R.id.Profilepic)

    menu.setHeaderTitle("Change Profile");
    menu.add(1, v.getId(), 0, "Take Photo");
    menu.add(1, v.getId(), 0, "Choose From Library");
    




@Override
public boolean onContextItemSelected(MenuItem item) 
    if (item.getGroupId() == 0) 

        if(item.getTitle()=="Take Photo") showCoverCameraFragment(); 
        else if(item.getTitle()=="Choose From Library")showCoverLibraryFragment();
        else return false;

     else if (item.getGroupId() == 1) 

        if(item.getTitle()=="Take Photo")showProfileCameraFragment();
        else if(item.getTitle()=="Choose From Library")showProfileLibraryFragment();
        else return false;
    




    return true;

【讨论】:

以上是关于Android listview - 长按显示错误的上下文菜单的主要内容,如果未能解决你的问题,请参考以下文章

使用 onlongClick 搜索 Listview 显示错误结果

android - 长按从 ListView 中删除项目

转android: 长按删除listview的item

android studio listview长按删除

Android:如何在listView上的项目中结合滑动手势和长按

android的ListView中如何设置长按Item的时候该Item背景变色