Necesito saber el píxel de la posición de un elemento en una lista que se ha mostrado usando un ListView. Me parece que debería conseguir uno de los TextView del y, a continuación, utilizar getTop(), pero no puedo averiguar cómo conseguir que un niño de un ListView.

Actualización: Los niños de la ViewGroup no corresponden a 1-a-1 con los elementos de la lista, para un ListView. En su lugar, el ViewGroup‘s de los niños corresponden sólo a aquellos puntos de vista que son visibles ahora. Así getChildAt() opera en un índice que se interna en el ViewGroup y no necesariamente tiene nada que ver con la posición en la lista que la ListView usos.

InformationsquelleAutor lacker | 2008-11-02

6 Comentarios

  1. 215

    Ver: Android ListView: obtener los datos de índice de elemento visible
    y se combina con la parte de los Pies de la respuesta anterior, le puede dar 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 usted no está iterando sobre el ListView niños, que podría tener un impacto en el rendimiento.

    • Gran respuesta, pero no a todo el trabajo a la derecha cuando usted ha encabezado las vistas de la lista. La asignación a firstPosition debe ser int firstPosition = listView.getFirstVisiblePosition() - listView.getHeaderViewsCount(); para solucionar este problema.
    • gracias, buen punto! He actualizado mi respuesta a cuenta de que.
    • ¿Es usted un médico ? porque usted es un protector de la vida.
    • perrrrrfect solución para mí. Upvote! Estaba luchando con esto por un tiempo.
    • ¿Por qué es tan complicado :((
    • Buena respuesta y funciona en la mayoría de los casos, pero no entiendo por qué cree usted que el niño vistas aparecen en el orden en que están en la matriz de niño vistas. Desde el punto de vista puede ser reutilizado cómo podemos estar seguros de que a primera vista no representan la última visible de la vista?
    • esto sólo puede suceder en el subproceso de interfaz de usuario; por lo tanto, el subproceso de interfaz de usuario será bloqueado, mientras que este código se está ejecutando, por lo tanto el niño vistas son fijos y no se pueden modificar. ListView ya es el manejo de «mover» el niño vistas de alrededor de después de que el reciclaje de edad convertViews, etc, por lo que puede se garantiza que ListView.getChildAt(0) se de hecho el primer adjunto de la vista desde el adaptador. Es posible que no sea completamente visible (y podría incluso no ser visibles en todo, dependiendo de ListView‘s umbral de la «visibilidad» antes de reciclar un punto de vista que considera que es «desplazado fuera de la vista»)
    • Lo que si quería una vista que no se muestra?
    • que no es como Android ListView obras. Si el elemento de la lista en la pantalla, su vista ya ha sido reciclada y reutilizada por uno de los otros elementos de la lista que están en la pantalla. Usted debe re-pensar cómo se está utilizando ListView si que es un requisito.
    • Tengo la misma pregunta que Matheus’. Trabajando en un ExpandableListView, si puedo hacer algo con el niño y la groupView no se muestra, no puedo cambiar su punto de vista. No se vuelve a dibujar el adaptador por cierto, lo he comprobado. Me gustaría ver una solución para que
    • La única manera, en mi caso fue a hacer adapter.notifyDataSetChanged() y dejar que el adaptador de recrear las Vistas (y actualizar lo que sea necesario). Pero no hay manera de cambiar la Vista de forma manual.
    • En qué método de Actividad o Fragmento que debo utilizar este código?

  2. 17

    Este código es fácil de usar:

     View rowView = listView.getChildAt(viewIndex);//The item number in the List View
        if(rowView != null)
            {
               //Your code here
            }
    • Esto funciona bien. No sé por qué tienes un downvote… upvote!
    • no funciona siempre. getChildAt cuenta desde la primera fila visible, no desde la parte superior de los datos.
    • El ViewID argumento es confuso. Es un índice (o posición). El punto de vista de IDENTIFICACIÓN es completamente un entero arbitrario, generados por la aapt herramienta.
  3. 6

    Una rápida búsqueda en google docs para la clase ListView se ha convertido hasta getChildCount() y getChildAt() los métodos heredados de ViewGroup. Se puede recorrer a través de ellos el uso de estos? No estoy seguro, pero vale la pena intentarlo.

    Encontrado aquí

    • He intentado esto, para hacer selecciones. Normalmente funciona, pero hay off-by-one errores a veces y no es confiable. Yo no lo recomiendo.
    • Gracias Timmmm, yo no había probado que la acaba de encontrar en la documentación.
  4. 5
    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, crear dos Dibujables – que es transparente, y otro que es el color que se desee. Solicitud de enfoque en la posición seleccionada (int position como se define) y cambiar el color de dicha fila. Luego caminar a través de los padres ListView, y cambiar todas las otras filas en consecuencia. Esto explica que cuando un usuario hace clic en el listview varias veces. Esto se hace con un diseño personalizado para cada fila en la ListView. (Muy sencillo, basta con crear un nuevo archivo de diseño con un TextView – no establece seleccionable o hacer clic!).

    No personalizado requiere adaptador de uso ArrayAdapter

    • getChildAt es relativa a la actual desplaza los elementos. Esto va a dejar de trabajar si usted se desplaza de su lista solo un poco.
  5. 4
    int position = 0;
    listview.setItemChecked(position, true);
    View wantedView = adapter.getView(position, null, listview);
    • Elaborar un poco
    • Dios bendiga a u amigo, u salvar mi vida.
  6. -9

    Esto supone conocer la posición del elemento en el control ListView :

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

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

    • getView() es llamado internamente por el ListView, al rellenar la lista. Que no se utiliza para obtener la vista en esa posición en la lista, como llamar a getView() con null para el convertView hace que el adaptador para inflar un nuevo punto de vista desde el adaptador de la disposición de recursos (no de obtener la opinión de que es ya que se muestra).
    • Excelente punto!
    • Incluso la posición de una posición en la pantalla visual, no el adaptador de datos de la posición de la fuente.
    • Se puede trabajar en CursorAdapter con nuevavista() y bindView().
    • Este es el método que he estado usando por que yo pensaba que es el mejor, pero cuando trato de hacer un progressbar en el niño invisible, sino que se hizo a todos los progressbars en listvew invisible……..todos en todos los aceptados respuesta hizo el truco

Dejar respuesta

Please enter your comment!
Please enter your name here