Как получить идентификатор списка, когда я нажимаю на пункт меню PopUp?

В моем приложении я прикрепил всплывающее меню с каждым элементом в списке. Во всплывающем меню есть еще два элемента, когда мы нажимаем значок всплывающего меню. Я реализовал OnMenuItemClickListener в своей деятельности, чтобы прослушивать щелчки элементов всплывающего меню, которые работают нормально. Но проблема в том, что как мне узнать идентификатор элемента списка (не идентификатор элемента всплывающего меню), когда я нажимаю значок всплывающего меню для любого элемента списка. Код всплывающего меню приведен ниже:

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

person Ansh    schedule 14.07.2014    source источник
comment
где вы называете showPopup?   -  person pskink    schedule 14.07.2014
comment
@pskink В моем XML-файле из события onclick просмотра изображений   -  person Ansh    schedule 14.07.2014
comment
Хорошо ... так что ваш вопрос на самом деле не о том, как сохранить какое-то значение и прочитать его в обратном вызове onMenuItemClick, а о том, что я создал атрибут onClick из xml и не знаю, как получить идентификатор представления элемента родительского списка? PopupMenu вообще не имеет ничего общего с этой проблемой, верно?   -  person Maciej Ciemięga    schedule 14.07.2014
comment
Да, ты прав @MaciejCiemięga   -  person Ansh    schedule 14.07.2014
comment
Прежде всего: зачем вам нужен идентификатор представления? Если вы хотите воспроизвести что-то из списка, вам скорее понадобится позиция для получения элемента из списка, связанного с этой позицией. Во-вторых: не используйте событие onClick из xml при создании списка... вместо этого установите OnClickListener в вашем адаптере - там у вас будет ваша ‹b›int position‹/b› (или идентификатор представления элемента списка, если вы действительно этого хотите). И, пожалуйста, обновите свой вопрос, потому что он действительно о совершенно другом.   -  person Maciej Ciemięga    schedule 14.07.2014
comment
@MaciejCiemięga Мне очень жаль за недопонимание, но мне нужна позиция, а не идентификатор   -  person Ansh    schedule 14.07.2014
comment
@MaciejCiemięga Для события щелчка элемента списка я использую адаптер, но не для всплывающего меню, которое я прикрепил к каждому элементу списка.   -  person Ansh    schedule 14.07.2014
comment
1. Пожалуйста, отправьте код для вашего адаптера. 2. Вы хотите, чтобы хэндл onMenuItemClick был в адаптере, активности, фрагменте или вам это не важно?   -  person Maciej Ciemięga    schedule 14.07.2014


Ответы (1)


Скажите, пожалуйста, что такое "идентификатор элемента списка", который вы хотите узнать? Я сомневаюсь, что это "идентификатор представления списка". Вероятно, вы имеете в виду "позицию", верно?

Я не знаю, откуда вы вызываете 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;
    }
}

Вы также можете сделать это многими другими способами, например создать собственный слушатель OnMenuItemClickListener с переменной listItemPosition в конструкторе и создать собственный интерфейс с помощью 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();
}
person Maciej Ciemięga    schedule 14.07.2014
comment
Мой вопрос: как мне получить значение listItemPosition, когда я нажимаю значок всплывающего меню? Вы передаете listItemPosition методу showPopup, но у меня нет значения для передачи этому методу. Мне нужно значение - person Ansh; 14.07.2014
comment
Я обновил свой ответ, чтобы сохранить идентификатор представления элемента списка вместо позиции. - person Maciej Ciemięga; 14.07.2014
comment
Я пробовал ваш код, но значение идентификатора, которое я получил, равно -1 для каждого элемента в списке. - person Ansh; 14.07.2014
comment
Да, пожалуйста, посмотрите мой комментарий к вашему вопросу. - person Maciej Ciemięga; 14.07.2014
comment
Я откатил свой комментарий к первой версии, показывающей, как сохранить позицию элемента списка. Это все, что вам нужно, чтобы решить проблему с PopupMenu. Чтобы решить другие ваши проблемы: установите OnClickListener из адаптера (не onClick из xml) и в этом слушателе вызовите метод showPopup(View v, final int listItemPosition), передав также позицию здесь. - person Maciej Ciemięga; 14.07.2014
comment
Спасибо @Maciej. Я переместил свой код в адаптер, и теперь я могу легко получить доступ к позиции. Большое спасибо. - person Ansh; 14.07.2014
comment
Без проблем. Пожалуйста, также не забудьте принять этот ответ, если он был полезен для вашей проблемы. - person Maciej Ciemięga; 14.07.2014