Android получает позицию щелкнутого элемента в gridview

как мы знаем, используя представление сетки Android, мы можем сделать следующее и получить уведомление при нажатии элемента:

gridview.setOnItemClickListener(new AdapterView.OnItemClickListener() {
    public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
    Toast.makeText(PopularCapitActivity.this, "" + position, Toast.LENGTH_SHORT).show();
    }
});

мы также знаем, что если ячейка в сетке содержит элемент, на который можно щелкнуть, скажем, кнопку, вышеприведенное не сработает.

так что в настоящее время у меня есть представление сетки, каждая ячейка имеет свою собственную кнопку, поэтому теперь, когда пользователь нажимает кнопку, у него будет свое собственное действие, основанное на ячейке, в которой находится кнопка, мой вопрос: как я могу получить доступ к положению ячейки в обработчике кнопки?

Спасибо


person user1697965    schedule 04.10.2012    source источник
comment
Используете ли вы специальный адаптер для GridView?   -  person dennisdrew    schedule 04.10.2012
comment
да, у меня есть собственный, просто расширяющий BaseListAdapter   -  person user1697965    schedule 04.10.2012


Ответы (1)


Предполагая, что вы используете специальный адаптер для GridVIew, в методе getView вы можете просто добавить тег к объекту Button, который содержит позицию, переданную в getView:

button.setTag(new Integer(position));

Затем в методе onClickListener с переданным представлением (кнопка) вы можете сделать:

Integer position = (Integer)view.getTag();

А затем обработайте значение позиции оттуда.

EDIT: кажется, что лучше всего сделать следующее:

button.setTag(Integer.valueOf(position));

вместо использования конструктора Integer.

person dennisdrew    schedule 04.10.2012
comment
Ого, спасибо. Мой единственный вопрос: почему у этого ответа нет 5000 голосов? Я единственный, кто размещает кнопки в GridViews? - person Chris Rae; 30.01.2013
comment
Спасибо! Я только что обновил свой ответ, чтобы учесть передовую практику. Рекомендуется использовать Integer.valueOf(position), а не конструктор. - person dennisdrew; 30.01.2013
comment
Отличное решение! Теперь, однако, Integer.valueOf(position) не требуется, просто передача position тоже будет работать. - person jpyams; 23.09.2015
comment
если вы хотите получить позицию в gridview, вы можете просто использовать int tag=(int)view.getTag(); int currentRow=tag/9;(поэтому моя сетка 9*9) int currentCol=tag%9; Чтобы установить тег, я использовал button.setTag((9*i)+j) во время итерации в gridview - person Ajit Hegde; 14.03.2016