Ich muss die Pixelposition eines Elements in einer Liste herausfinden, die mit a angezeigt wurde ListView
. Es scheint, als sollte ich eine der Textansichten herunterladen und dann verwenden getTop()
, aber ich kann nicht herausfinden, wie ich eine untergeordnete Ansicht von einer bekomme ListView
.
Update: Die untergeordneten ViewGroup
Elemente von entsprechen nicht 1: 1 den Elementen in der Liste, z ListView
. Stattdessen ViewGroup
entsprechen die untergeordneten Elemente nur den Ansichten, die gerade sichtbar sind. So getChildAt()
arbeitet auf einem Index, der auf die innere ist ViewGroup
und nicht unbedingt etwas mit der Position in der Liste zu tun haben , dass die ListView
Anwendungen.
firstPosition
sollte seinint firstPosition = listView.getFirstVisiblePosition() - listView.getHeaderViewsCount();
, dies zu beheben.ListView
ist bereits um nach dem Recycling alten „Bewegen“ die Ansichten Kind HandhabungconvertView
, etc, so dass Sie kann garantiert werden , dassListView.getChildAt(0)
ist der erste angebrachte Blick aus dem Adapter in der Tat. Es ist möglicherweise nicht vollständig sichtbar (und möglicherweise überhaupt nicht sichtbar, abhängig vonListView
der Schwelle der "Sichtbarkeit", bevor eine Ansicht recycelt wird, die als "aus der Ansicht gescrollt" betrachtet wird)Dieser Code ist einfacher zu verwenden:
quelle
Bei einer schnellen Suche in den Dokumenten nach der ListView-Klasse wurden die von ViewGroup geerbten Methoden getChildCount () und getChildAt () gefunden. Können Sie sie mit diesen durchlaufen? Ich bin mir nicht sicher, aber es ist einen Versuch wert.
Fand es hier
quelle
Erstellen Sie grundsätzlich zwei Drawables - eines, das transparent ist, und eines, das die gewünschte Farbe hat. Fordern Sie den Fokus an der angeklickten Position (
int position
wie definiert) an und ändern Sie die Farbe der Zeile. Gehen Sie dann durch das übergeordnete ElementListView
und ändern Sie alle anderen Zeilen entsprechend. Dies gilt, wenn ein Benutzerlistview
mehrmals auf die Schaltfläche klickt . Dies erfolgt mit einem benutzerdefinierten Layout für jede Zeile in derListView
. (Sehr einfach, erstellen Sie einfach eine neue Layoutdatei mit einemTextView
- nicht fokussierbar oder anklickbar!).Kein benutzerdefinierter Adapter erforderlich - verwenden
ArrayAdapter
quelle
quelle
Dies setzt voraus, dass Sie die Position des Elements in der ListView kennen:
Dann sollten Sie in der Lage sein, getLeft () und getTop () aufzurufen, um die Elemente auf der Bildschirmposition zu bestimmen.
quelle
getView()
wird intern von der ListView aufgerufen, wenn die Liste gefüllt wird. Sie sollten es nicht verwenden, um die Ansicht an dieser Position in der Liste abzurufen, da das AufrufengetView()
mit null fürconvertView
bewirkt, dass der Adapter eine neue Ansicht aus der Layoutressource des Adapters aufbläst (erhält nicht die Ansicht, die bereits angezeigt wird).