Страницы

Поиск по вопросам

четверг, 19 марта 2020 г.

Неправильно работают кнопки внутри ListView

#getview #android #listview #java


У меня есть ListView, в каждом элементе которого есть 2 кнопки.
Я, естественно, использую свой адаптер для отображения ListView.
В функции getView, которая формирует вью для конкретной строки списка я выставляю
OnClick хендлеры для этих кнопок.
Проблема в том, что кнопки начинают реагировать на клики только после второй перерисовки.
То есть, что бы нажать на кнопку, которая находится в первой строке списка, мне нужно
опустить список вниз так, что бы первая строка ушла за пределы экрана, и перерисовалась.
Вопрос: как вызвать принудительную перерисовку (или что там вызывается перед отрисовкой
строки),  или как выставить онклик обработчики так, что бы они работали сразу?     


Ответы

Ответ 1



Я думаю, что выставление хэндлеров в getView() - это плохая идея. Я бы сделал по другому: сначала бы сформировал массив вьюшек, выставил бы каждому из них хэндлеры, потом при рисовании ListView уже брал вьюшки из массива и возвращал через getView().

Ответ 2



Не знаю, поможет ли, но попробуйте вызвать прорисовку списка вручную: listview.invalidate(). Если конечно они ведут себя так из-за прорисовки, как Вы говорите.

Ответ 3



У меня недавно тоже стояла такая задача (элементы у меня были все одного вида). Как я поступил: набросал шаблон одного элемента ListView в xml (две кнопки, три текстовых поля и прогресс бар). Затем в xml для кнопок назначил обработчики нажатия событий: ... android:OnClick = "" ... и уже когда формировал адаптер, я добавил свой ViewBinder через .setViewBinder у адаптера. В этом ViewBinder'e я каждой кнопке присваивал тег, который зависел от номера элемента в списке ListView, и уже в обработчике я смотрел у View тег и выполнял свои действия. Может это тебе поможет. У меня не возникло никаких проблем с нажатием на кнопки, все запустилось с первого раза. Если не понятно будет, могу привести пример кода.

Комментариев нет:

Отправить комментарий