Necesito averiguar la posición de píxel de un elemento en una lista que se ha mostrado usando un ListView
. Parece que debería obtener uno de TextView y luego usarlo getTop()
, pero no puedo averiguar cómo obtener una vista secundaria de un archivoListView
.
Actualización: los elementos secundarios de ViewGroup
no se corresponden 1 a 1 con los elementos de la lista, para a ListView
. En cambio, los elementos ViewGroup
secundarios de 'corresponden solo a las vistas que son visibles en este momento. Entonces getChildAt()
opera en un índice que es interno al ViewGroup
y no necesariamente tiene nada que ver con la posición en la lista que ListView
usa.
firstPosition
debería serint firstPosition = listView.getFirstVisiblePosition() - listView.getHeaderViewsCount();
arreglar esto.ListView
ya está manejando "mover" las vistas secundarias después de reciclarconvertView
s antiguas , etc., por lo que puede estar seguro de queListView.getChildAt(0)
es la primera vista adjunta desde el adaptador. Es posible que no sea completamente visible (y es posible que ni siquiera sea visible en absoluto, según elListView
umbral de "visibilidad" antes de reciclar una vista que se considera "desplazada fuera de la vista")Este código es más fácil de usar:
fuente
Una búsqueda rápida de los documentos de la clase ListView ha arrojado los métodos getChildCount () y getChildAt () heredados de ViewGroup. ¿Puedes recorrerlos usando estos? No estoy seguro, pero vale la pena intentarlo.
Lo encontré aquí
fuente
Básicamente, crea dos Dibujables : uno transparente y otro del color deseado. Solicite el enfoque en la posición en la que se hizo clic (
int position
como se define) y cambie el color de dicha fila. Luego, revise el padreListView
y cambie todas las demás filas en consecuencia. Esto tiene en cuenta cuando un usuario hace clic enlistview
varias veces. Esto se hace con un diseño personalizado para cada fila de laListView
. (Muy simple, simplemente cree un nuevo archivo de diseño con unTextView
- ¡no establezca que se pueda enfocar o hacer clic!).No se requiere adaptador personalizado - usar
ArrayAdapter
fuente
fuente
Esto supone que conoce la posición del elemento en ListView:
Entonces debería poder llamar a getLeft () y getTop () para determinar los elementos en la posición de la pantalla.
fuente
getView()
es llamado internamente por ListView, al completar la lista. No debe usarlo para obtener la vista en esa posición en la lista, ya que llamargetView()
con null paraconvertView
hace que el adaptador infle una nueva vista desde el recurso de diseño del adaptador (no obtiene la vista que ya se está mostrando).