Muszę znaleźć pozycję piksela jednego elementu na liście, która została wyświetlona przy użyciu ListView
. Wygląda na to, że powinienem pobrać jeden z TextView, a następnie użyć getTop()
, ale nie mogę dowiedzieć się, jak uzyskać widok podrzędny pliku ListView
.
Aktualizacja: elementy podrzędne elementu ViewGroup
nie odpowiadają 1-do-1 elementom na liście, dla a ListView
. Zamiast tego ViewGroup
dzieci odpowiadają tylko tym widokom, które są teraz widoczne. Więc getChildAt()
działa na indeksie, który jest wewnętrzny w stosunku do indeksu ViewGroup
i nie musi mieć nic wspólnego z pozycją na liście, której ListView
używa.
źródło
firstPosition
powinno byćint firstPosition = listView.getFirstVisiblePosition() - listView.getHeaderViewsCount();
naprawienie tego.ListView
już jest handling „ruchomych” poglądy dzieci dookoła po recyklingu starychconvertView
s, itp, więc może być zagwarantowane, żeListView.getChildAt(0)
jest w rzeczywistości pierwszym załączeniu widok z adapterem. Może nie być w pełni widoczny (i może nawet nie być widoczny, w zależności odListView
progu „widoczności” przed odtworzeniem widoku, który uważa za „przewinięty z widoku”)Ten kod jest łatwiejszy w użyciu:
źródło
Szybkie przeszukanie dokumentacji dla klasy ListView pozwoliło uzyskać metody getChildCount () i getChildAt () odziedziczone po ViewGroup. Czy możesz je powtórzyć za pomocą tych? Nie jestem pewien, ale warto spróbować.
Znalazłem to tutaj
źródło
Zasadniczo utwórz dwa Drawables - jeden, który jest przezroczysty, a drugi o pożądanym kolorze. Poproś o zaznaczenie klikniętej pozycji (
int position
zgodnie z definicją) i zmień kolor wspomnianego wiersza. Następnie przejdź przez rodzicaListView
i odpowiednio zmień wszystkie pozostałe wiersze. Uwzględnia to sytuacje, gdy użytkownik kliknielistview
wiele razy. Odbywa się to za pomocą niestandardowego układu dla każdego wiersza wListView
. (Bardzo proste, po prostu utwórz nowy plik układu zTextView
- nie ustawiaj fokusu ani klikalności!).Nie jest wymagany niestandardowy adapter - użyj
ArrayAdapter
źródło
źródło
Zakłada się, że znasz pozycję elementu w ListView:
Wtedy powinieneś móc wywołać getLeft () i getTop () w celu określenia pozycji elementów na ekranie.
źródło
getView()
jest wywoływana wewnętrznie przez ListView podczas wypełniania listy. Nie należy go używać do pobierania widoku na tej pozycji na liście, ponieważ wywołaniegetView()
z wartością null dla argumentówconvertView
powoduje, że adapter wypełnia nowy widok z zasobu układu adaptera (nie uzyskuje widoku, który jest już wyświetlany).