Pregunta

Necesito averiguar la posición de píxel de un elemento en una lista que se muestra usando un ListView . Parece que debería obtener uno de los TextView y luego usar getTop () , pero no puedo averiguar cómo obtener una vista secundaria de un ListView .

Actualización: Los hijos del ViewGroup no se corresponden 1 a 1 con los elementos de la lista, para un ListView . En cambio, los hijos de ViewGroup corresponden solo a las vistas que están visibles en este momento. Así que getChildAt () opera en un índice que es interno al ViewGroup y no tiene necesariamente nada que ver con la posición en la lista que el ListView usos.

¿Fue útil?

Solución

Consulte: ListView para Android: obtenga el índice de datos de elemento visible y combinar con parte de la respuesta de Feet anterior, puede darle algo como:

int wantedPosition = 10; // Whatever position you're looking for
int firstPosition = listView.getFirstVisiblePosition() - listView.getHeaderViewsCount(); // This is the same as child #0
int wantedChild = wantedPosition - firstPosition;
// Say, first visible position is 8, you want position 10, wantedChild will now be 2
// So that means your view is child #2 in the ViewGroup:
if (wantedChild < 0 || wantedChild >= listView.getChildCount()) {
  Log.w(TAG, "Unable to get view for desired position, because it's not being displayed on screen.");
  return;
}
// Could also check if wantedPosition is between listView.getFirstVisiblePosition() and listView.getLastVisiblePosition() instead.
View wantedView = listView.getChildAt(wantedChild);

El beneficio es que no estás iterando sobre los hijos de ListView, lo que podría tener un impacto en el rendimiento.

Otros consejos

Este código es más fácil de usar:

 View rowView = listView.getChildAt(viewIndex);//The item number in the List View
    if(rowView != null)
        {
           // Your code here
        }

Una búsqueda rápida de los documentos para la clase ListView ha mostrado los métodos getChildCount () y getChildAt () heredados de ViewGroup. ¿Puedes recorrerlos usando estos? No estoy seguro, pero vale la pena intentarlo.

Lo encontré aquí

listview.setOnItemClickListener(new AdapterView.OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> parent, final View view, int position, long id) {
        View v;
        int count = parent.getChildCount();
        v = parent.getChildAt(position);
        parent.requestChildFocus(v, view);
        v.setBackground(res.getDrawable(R.drawable.transparent_button));
        for (int i = 0; i < count; i++) {
            if (i != position) {
                v = parent.getChildAt(i);
                v.setBackground(res.getDrawable(R.drawable.not_clicked));
            }
        }
    }
});

Básicamente, cree dos Dibujables , uno transparente y otro con el 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, recorra el ListView principal y cambie todas las demás filas en consecuencia. Esto se tiene en cuenta cuando un usuario hace clic en el listview varias veces. Esto se hace con un diseño personalizado para cada fila en el ListView . (Muy simple, simplemente cree un nuevo archivo de diseño con un TextView - ¡no establezca enfocable ni haga clic!).

No se requiere adaptador personalizado: use ArrayAdapter

int position = 0;
listview.setItemChecked(position, true);
View wantedView = adapter.getView(position, null, listview);

Esto supone que sabes la posición del elemento en el ListView:

  View element = listView.getListAdapter().getView(position, null, null);

Entonces deberías poder llamar a getLeft () y getTop () para determinar los elementos en la posición de la pantalla.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top