【问题标题】:How to get listitem id when I click on PopUp menu item?单击弹出菜单项时如何获取列表项ID?
【发布时间】:2014-07-14 06:55:17
【问题描述】:

在我的应用程序中,我为列表视图中的每个项目附加了弹出菜单。当我们单击弹出菜单图标时,弹出菜单还有两个项目。我在我的活动中实现了OnMenuItemClickListener 来监听弹出菜单项的点击,这工作正常。但问题是我如何知道列表项 id (不是弹出菜单项 ID)当我单击任何列表视图项的弹出菜单图标时。弹出菜单代码如下:

public void showPopup(View v) {
        PopupMenu popup = new PopupMenu(this, v);
        popup.setOnMenuItemClickListener(this);
        popup.inflate(R.menu.actions);
        popup.show();
    }

    @Override
    public boolean onMenuItemClick(MenuItem item) {
        switch (item.getItemId()) {
            case R.id.menu_play:
                return true;
            default:
                return false;
        }
    }

【问题讨论】:

  • 你在哪里调用 showPopup?
  • @pskink 在我的 xml 文件中来自 imageview onclick 事件
  • 好的......所以你的问题不是关于“如何存储一些值并在 onMenuItemClick 回调中读取它”,而是“我已经从 xml 创建了 onClick 属性并且不知道如何获取父列表项视图的 id”? PopupMenu 和这个问题完全没有关系,对吧?
  • 是的,你是对的@MaciejCiemięga
  • 首先:为什么你需要视图的id?如果你想从列表中播放一些东西,你宁愿需要一个位置来从与该位置相关的列表中获取项目。第二:在制作列表时不要使用 xml 中的 onClick 事件...在您的适配器中设置 OnClickListener - 您将拥有您的 int 位置(或列表项视图的 id,如果您真的想要它)。请更新您的问题,因为它确实是完全不同的事情。

标签: android android-layout popupmenu


【解决方案1】:

请告诉我您想知道什么是“listitem id”?我怀疑它是一个“listitem view's id”。可能您正在考虑“位置”,对吧?

我不知道你从哪里调用 showPopup(View v),但你还需要在那里传递位置:

public void showPopup(View v, int listItemPosition) {
    PopupMenu popup = new PopupMenu(this, v);
    popup.setOnMenuItemClickListener(this);
    popup.inflate(R.menu.actions);
    popup.show();
}

您的目标是在 onMenuItemClick(MenuItem item) 回调中知道这个位置。
实现这一点的最简单方法是创建变量“listItemPositionForPopupMenu”,将该位置存储在那里并在 onMenuItemClick 回调中读取它:

private int listItemPositionForPopupMenu;

public void showPopup(View v, int listItemPosition) {
    listItemPositionForPopupMenu = listItemPosition;
    PopupMenu popup = new PopupMenu(this, v);
    popup.setOnMenuItemClickListener(this);
    popup.inflate(R.menu.actions);
    popup.show();
}

@Override
public boolean onMenuItemClick(MenuItem item) {
    switch (item.getItemId()) {
        case R.id.menu_play:
            // read the listItemPositionForPopupMenu here
            return true;
        default:
            return false;
    }
}

您还可以通过许多其他方式进行操作,例如在构造函数中使用 listItemPosition 变量创建自己的 OnMenuItemClickListener 侦听器,并使用 onMenuItemClick(MenuItem item 创建自定义接口, int listItemPosition)。或者你可以只创建一个匿名类,那么你不需要有 listItemPositionForPopupMenu 成员变量:

public void showPopup(View v, final int listItemPosition) {
    PopupMenu popup = new PopupMenu(this, v);
    popup.setOnMenuItemClickListener(new OnMenuItemClickListener() {
        @Override
        public boolean onMenuItemClick(MenuItem item) {
            switch (item.getItemId()) {
                case R.id.menu_play:
                    // read the listItemPosition here
                    return true;
                default:
                    return false;
            }
        }
    });
    popup.inflate(R.menu.actions);
    popup.show();
}

【讨论】:

  • 我的问题是当我单击弹出菜单图标时如何获取 listItemPosition 的值?您正在将 listItemPosition 传递给 showPopup 方法,但我没有传递给此方法的值。我需要该值
  • 我已将答案更新为商店列表项视图的 id 而不是位置。
  • 我已经尝试过您的代码,但对于 listview 中的每个项目,我得到的 id 值都是“-1”。
  • 是的,请查看我对您问题的评论。
  • 我已将我的评论回滚到显示如何存储列表项位置的第一个版本。这就是解决 PopupMenu 问题所需要的一切。要解决您的其他问题:从适配器设置 OnClickListener(而不是从 xml 设置 onClick),并在此侦听器中调用 showPopup(View v, final int listItemPosition) 方法,并在此处传递位置。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多