Мне нужно узнать позицию в пикселях одного элемента в списке, отображаемом с помощью ListView
. Кажется, я должен получить один из TextView, а затем использовать getTop()
, но я не могу понять, как получить дочернее представление файла ListView
.
Обновление: дочерние ViewGroup
элементы не соответствуют 1 к 1 элементам в списке для файла ListView
. Вместо этого ViewGroup
дочерние элементы соответствуют только тем представлениям, которые видны прямо сейчас. So getChildAt()
работает с индексом, который является внутренним для класса ViewGroup
и не обязательно имеет какое-либо отношение к позиции в списке, который ListView
использует.
источник
firstPosition
должна состоять в том,int firstPosition = listView.getFirstVisiblePosition() - listView.getHeaderViewsCount();
чтобы это исправить.ListView
уже обрабатывает "перемещение" дочерних представлений после повторного использования старыхconvertView
s и т. д., так что вы можете быть уверены, чтоListView.getChildAt(0)
это фактически первое прикрепленное представление из адаптера. Это может быть не полностью видно (и может даже не быть видимым вообще, в зависимости отListView
порогового значения «видимости» до повторного использования представления, которое, по его мнению, «прокручивается вне поля зрения»)Этот код проще использовать:
источник
Быстрый поиск в документации для класса ListView обнаружил методы getChildCount () и getChildAt (), унаследованные от ViewGroup. Можете ли вы перебрать их, используя их? Я не уверен, но попробовать стоит.
Нашел здесь
источник
По сути, создайте два Drawable - один прозрачный, а другой желаемого цвета. Запросите фокус в выбранной позиции (
int position
как определено) и измените цвет указанной строки. Затем пройдите по родительскому элементуListView
и соответствующим образом измените все остальные строки. Это учитываетlistview
случаи, когда пользователь нажимает кнопку несколько раз. Это делается с помощью индивидуального макета для каждой строки вListView
. (Очень просто, просто создайте новый файл макета сTextView
- не устанавливайте фокусируемый или кликабельный!).Специальный адаптер не требуется - используйте
ArrayAdapter
источник
источник
Это предполагает, что вы знаете позицию элемента в ListView:
Затем у вас должна быть возможность вызывать getLeft () и getTop (), чтобы определять положение элементов на экране.
источник
getView()
вызывается изнутри ListView при заполнении списка. Вы не должны использовать его для получения представления в этой позиции в списке, поскольку вызовgetView()
с нулевым значениемconvertView
заставляет адаптер раздувать новое представление из ресурса макета адаптера (не получает представление, которое уже отображается).