У меня есть, ListView
где каждый элемент в списке содержит TextView и две разные кнопки. Что-то вроде этого:
ListView
--------------------
[Text]
[Button 1][Button 2]
--------------------
[Text]
[Button 1][Button 2]
--------------------
... (and so on) ...
С помощью этого кода я могу создать OnItemClickListener
для всего элемента:
listView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> list, View view, int position, long id) {
Log.i(TAG, "onListItemClick: " + position);
}
}
});
Однако я не хочу, чтобы весь элемент был кликабельным, а только две кнопки каждого элемента списка.
Итак, мой вопрос, как мне реализовать onClickListener для этих двух кнопок со следующими параметрами:
int button
(какая кнопка элемента была нажата)int position
(который является элементом в списке, по которому произошло нажатие кнопки)
Обновление: я нашел решение, как описано в моем ответе ниже. Теперь я могу нажать / нажать кнопку через сенсорный экран. Однако я не могу вручную выбрать его с помощью трекбола. Он всегда выбирает весь элемент списка и оттуда сразу переходит к следующему элементу списка, игнорируя кнопки, хотя я установил .setFocusable(true)
и setClickable(true)
для кнопок в getView()
.
Я также добавил этот код в свой адаптер списка:
@Override
public boolean areAllItemsEnabled() {
return false;
}
@Override
public boolean isEnabled(int position) {
return false;
}
Это приводит к тому, что ни один элемент списка больше не может быть выбран вообще. Но это не помогло сделать вложенные кнопки выбираемыми.
Есть идеи?
Ответы:
Решение этой проблемы на самом деле проще, чем я думал. Вы можете просто добавить в
getView()
методе своего пользовательского адаптера setOnClickListener () для кнопок, которые вы используете.Любые данные, связанные с кнопкой, должны быть добавлены
myButton.setTag()
вgetView()
и могут быть доступны в onClickListener черезview.getTag()
Я разместил подробное решение в своем блоге в качестве учебного пособия.
источник
Это своего рода ответ придатка @ znq ...
Есть много случаев, когда вы хотите узнать положение строки для элемента, по которому щелкнули, И вы хотите знать, какой вид в строке был нажат. Это будет намного важнее в планшетных интерфейсах.
Вы можете сделать это с помощью следующего пользовательского адаптера:
источник
Для будущих читателей:
Чтобы вручную выбрать кнопки с помощью трекбола:
И чтобы отключить фокус на весь список элементов:
У меня это работает нормально, я могу нажимать на кнопки с сенсорным экраном, а также позволяет фокусировать клик с помощью клавиатуры
источник
У меня не так много опыта, как у вышеупомянутых пользователей, но я столкнулся с той же проблемой и решил ее с помощью нижеприведенного решения.
btnRemoveClick Событие клика
источник
Возможно, вы нашли, как это сделать, но вы можете позвонить
и теперь ваши кнопки поймают фокус
источник
Я не уверен, что будет лучшим способом, но работает нормально, и весь код остается в вашем ArrayAdapter.
источник
Я знаю, что уже поздно, но это может помочь, это пример того, как я пишу собственный класс адаптера для различных действий щелчка
источник
Разве платформенное решение для этой реализации не использует контекстное меню, которое отображается при долгом нажатии?
Знает ли автор вопроса о контекстных меню? Расположение кнопок в представлении списка влияет на производительность, загромождает ваш интерфейс и нарушает рекомендуемый дизайн интерфейса для платформы.
С другой стороны; контекстные меню - по природе отсутствия пассивного представления - не очевидны для конечного пользователя. Рассматриваете документирование поведения?
Это руководство должно дать вам хорошее начало.
http://www.mikeplate.com/2010/01/21/show-a-context-menu-for-long-clicks-in-an-android-listview/
источник