Форум программистов, компьютерный форум, киберфорум
Наши страницы
Программирование Android
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.78/23: Рейтинг темы: голосов - 23, средняя оценка - 4.78
Severomor1
0 / 0 / 0
Регистрация: 09.01.2014
Сообщений: 36
1

Обработка нажатия CheckBox в ListView

22.04.2014, 13:53. Просмотров 4235. Ответов 31
Метки нет (Все метки)

Привет,
Есть ListView на основе BaseAdapter. Каждый элемент содержит TextView и несколько чекбоксов. Как обработать нажатие на конкретный CheckBox? onListItemClick при нажатие на чекбокс не вызывается.
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.04.2014, 13:53
Ответы с готовыми решениями:

CheckBox обработка события нажатия
Проблема в следующем. Есть своего рода каталог картинок возле которой стоит...

Данные из SQlite в ListView, обработка события ListView
Ребят, есть БД, ListView. Надо при нажатии на строчку ListView вытащить данные...

Создание ListView с CheckBox из БД
Привет, приложение создает БД с полями id, String и Int _id Name Check...

Обработчик нажатия на ListView
Добрый день, перерыл много сайтов, но ответ все же не нашел. Проблема в...

ListView не реагирует на нажатия
Кинул на активность элемент ListView, присвоил ей кастомный адаптер и слой для...

31
NiRamz
211 / 211 / 33
Регистрация: 26.12.2010
Сообщений: 691
22.04.2014, 14:53 2
Лучший ответ Сообщение было отмечено Severomor1 как решение

Решение

сделайте класс
Java
1
2
3
4
5
6
7
8
private class MyListener implements CheckBox.OnCheckedChangeListener {
        @Override
        public void onCheckedChanged(CompoundButton view, boolean isChecked) {
            switch (view.getId()) {
                case ...
            }
        }
    }
и в getView ставьте на чекбоксы .setOn...(new MyListener());
1
Severomor1
0 / 0 / 0
Регистрация: 09.01.2014
Сообщений: 36
22.04.2014, 15:47  [ТС] 3
NiRamz, спасибо, работает!
Еще вопрос: это же получается, что на каждый CheckBox на экране будет создан new MyListener? Не многовато будет?
0
646kapeh064
59 / 58 / 16
Регистрация: 09.12.2013
Сообщений: 208
22.04.2014, 16:10 4
Severomor1, можешь создать один и привязать ко всем)
Java
1
2
3
4
5
6
MyListener listener = new MyListener();
// а тут привязываешь
.setOn...(listener);
.setOn...(listener);
.setOn...(listener);
.setOn...(listener);
0
Severomor1
0 / 0 / 0
Регистрация: 09.01.2014
Сообщений: 36
22.04.2014, 16:15  [ТС] 5
646kapeh064, я так и думал, но как тогда в listener определить позицию элемента ListView, в которой был нажат чекбокс?
0
646kapeh064
59 / 58 / 16
Регистрация: 09.12.2013
Сообщений: 208
22.04.2014, 16:20 6
Severomor1, а ты как определял до этого?
0
NiRamz
211 / 211 / 33
Регистрация: 26.12.2010
Сообщений: 691
22.04.2014, 16:24 7
Цитата Сообщение от 646kapeh064 Посмотреть сообщение
можешь создать один и привязать ко всем)
не получится
Цитата Сообщение от Severomor1 Посмотреть сообщение
Еще вопрос: это же получается, что на каждый CheckBox на экране будет создан new MyListener? Не многовато будет?
не будет, вьюхи которые за пределами экрана убираются в кеш, далее при появлении на экране мы переопределяем листенера, а старый убьется сборщиком.
0
646kapeh064
59 / 58 / 16
Регистрация: 09.12.2013
Сообщений: 208
22.04.2014, 16:28 8
Цитата Сообщение от NiRamz Посмотреть сообщение
не получится
Почему не получится? По всем законам Java это логичная операция.
Тем-более, в твоем коде:
Java
1
2
3
4
5
6
7
8
private class MyListener implements CheckBox.OnCheckedChangeListener {
        @Override
        public void onCheckedChanged(CompoundButton view, boolean isChecked) {
            switch (view.getId()) { // Вот тут : )
                case ...
            }
        }
    }
ты предусмотрел такой вариант идентификации объекта
0
Severomor1
0 / 0 / 0
Регистрация: 09.01.2014
Сообщений: 36
22.04.2014, 16:31  [ТС] 9
Цитата Сообщение от 646kapeh064 Посмотреть сообщение
Severomor1, а ты как определял до этого?
Ах да, из getView же можно взять.
0
NiRamz
211 / 211 / 33
Регистрация: 26.12.2010
Сообщений: 691
22.04.2014, 16:32 10
уверены?
будет 10 элементов в списке, в каждом из них будет вьюха с идентификатором text, как вы определите на какую именно было нажато?
Да, можно по другому, но этот более правильный.
0
646kapeh064
59 / 58 / 16
Регистрация: 09.12.2013
Сообщений: 208
22.04.2014, 16:36 11
Цитата Сообщение от NiRamz Посмотреть сообщение
в каждом из них будет вьюха с идентификатором text, как вы определите на какую именно было нажато?
Действительно... архитектура в андроиде странная. Забыл про это.

Ну ладно хоть до самого View можно достучаться из события и кастовать его к нужному типу, например к CheckBox
0
Severomor1
0 / 0 / 0
Регистрация: 09.01.2014
Сообщений: 36
22.04.2014, 16:37  [ТС] 12
Цитата Сообщение от NiRamz Посмотреть сообщение
будет 10 элементов в списке, в каждом из них будет вьюха с идентификатором text, как вы определите на какую именно было нажато?
Конкретный чекбокс в элементе определяем по getId, а номер элемента возьмем из getView, не?
0
NiRamz
211 / 211 / 33
Регистрация: 26.12.2010
Сообщений: 691
22.04.2014, 16:45 13
getView вызывается в цикле при заполнении списка, вы оттуда никак не сможете достать позицию нужного элемента. Я вам говорю как нужно сделать, хотя если хотите извратиться можете сделать так:
назначить на список onTouchListener, при срабатывании вытаскивать координаты касания, далее в цикле прогонять вьюхи списка и проверять на пересечение, получите позицию вьюхи (!!!) в списке, далее к первому видимому элементу прибавляем это количество и вуаля, у вас есть позиция нужная.
Можно так же ставить позицию через setTag().

Это первое что пришло в голову из извращенных вариантов
0
Severomor1
0 / 0 / 0
Регистрация: 09.01.2014
Сообщений: 36
22.04.2014, 16:50  [ТС] 14
Цитата Сообщение от NiRamz Посмотреть сообщение
getView вызывается в цикле при заполнении списка, вы оттуда никак не сможете достать позицию нужного элемента.
Мммм... хорошо, а в Вашем варианте я ее откуда возьму? Номер конкретного чекбокса из view.getId, а номер элемента в списке?
0
NiRamz
211 / 211 / 33
Регистрация: 26.12.2010
Сообщений: 691
22.04.2014, 17:26 15
можете в конструктор класса передавать позицию.
0
Severomor1
0 / 0 / 0
Регистрация: 09.01.2014
Сообщений: 36
23.04.2014, 10:20  [ТС] 16
Цитата Сообщение от NiRamz Посмотреть сообщение
можете в конструктор класса передавать позицию.
А откуда ее взять? Городить огород с onTouchListener?

Добавлено через 6 минут
Цитата Сообщение от Severomor1 Посмотреть сообщение
А откуда ее взять? Городить огород с onTouchListener?
А, можно же в getView сделать к чекбоксам setTag с позицией, а в листенере геттагом получить!
0
NiRamz
211 / 211 / 33
Регистрация: 26.12.2010
Сообщений: 691
23.04.2014, 10:42 17
вы листенер выставляете в getView, оттуда же в конструктор передаете позицию

Добавлено через 52 секунды
в теги лучше ставить ViewHolder'ы, при большом списке будет меньше тормозов
0
MonsterNya
0 / 0 / 0
Регистрация: 04.03.2014
Сообщений: 27
23.04.2014, 14:28 18
Приветствую всех! Возник аналогичный тематический вопрос, имеется ListView и SimpleCursorAdapter, в ListView несколько TextView и CheckedTextView (RadioButton). Обрабатываю нажатие на строку списка и делаю дальнейшие действия, соответственно обработать нажатие на CheckedTextView невозможно(?), т.к. обрабатывается нажатие на строку целиком, значит надо вынести CheckedTextView из строки. Создал дополнительный ListView для CheckedTextView, но получил несоответствие высоты строк. Как можно решить проблему несоответствия высоты строк или как создать в одном ListView две кликабельные колонки? Tablelayout не предлагать, т.к. надо переделывать слишком много кода.
0
kirawa
35 / 35 / 2
Регистрация: 12.11.2013
Сообщений: 345
23.04.2014, 16:03 19
MonsterNya ты ваще не то делаешь я те скажу CheckedTextView это епты готовое решение, делай сам все епты почитай про listview там BaseAdapter
0
NiRamz
211 / 211 / 33
Регистрация: 26.12.2010
Сообщений: 691
23.04.2014, 16:10 20
Цитата Сообщение от kirawa Посмотреть сообщение
MonsterNya ты ваще не то делаешь я те скажу CheckedTextView это епты готовое решение, делай сам все епты почитай про listview там BaseAdapter

Не по теме:

лишь бы ляпнуть?


MonsterNya, если необходимо обрабатывать отдельные вьюхи в итеме listview, то нужно делать как я писал выше. Только в вашем случаи нужно сделать implements View.OnClickListener и тогда сможете отловить нажатие на любой вьюхе в строке.
0
23.04.2014, 16:10
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.04.2014, 16:10

Сохранение состояния Checkbox в Listview
Возникла проблема с сохранением состояния checkbox'ов в Listview. Listview...

Перестали происходить нажатия на ListView
Кто не спит, помогите как можно скорее. Есть ListView. вроде ничего не трогал,...

Кнопка в listView и обработчик нажатия
Здравствуйте.Помогите пожалуста. Есть список ListView обрабатываю нажатие...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru