adaptador de vista de lista personalizado Se llama al método getView varias veces, y en un orden no coherente

Tengo un adaptador de lista personalizado:

class ResultsListAdapter extends ArrayAdapter { 

en el método ‘getView’ anulado hago una impresión para verificar qué posición es y si es una vista convertida o no:

  @Override public View getView(int position, View convertView, ViewGroup parent) { System.out.println("getView " + position + " " + convertView); 

El resultado de esto (cuando la lista se muestra por primera vez, no hay entrada de usuario por el momento)

 04-11 16:24:05.860: INFO/System.out(681): getView 0 null 04-11 16:24:29.020: INFO/System.out(681): getView 1 android.widget.RelativeLayout@43d415d8 04-11 16:25:48.070: INFO/System.out(681): getView 2 android.widget.RelativeLayout@43d415d8 04-11 16:25:49.110: INFO/System.out(681): getView 3 android.widget.RelativeLayout@43d415d8 04-11 16:25:49.710: INFO/System.out(681): getView 0 android.widget.RelativeLayout@43d415d8 04-11 16:25:50.251: INFO/System.out(681): getView 1 null 04-11 16:26:01.300: INFO/System.out(681): getView 2 null 04-11 16:26:02.020: INFO/System.out(681): getView 3 null 04-11 16:28:28.091: INFO/System.out(681): getView 0 null 04-11 16:37:46.180: INFO/System.out(681): getView 1 android.widget.RelativeLayout@43cff8f0 04-11 16:37:47.091: INFO/System.out(681): getView 2 android.widget.RelativeLayout@43cff8f0 04-11 16:37:47.730: INFO/System.out(681): getView 3 android.widget.RelativeLayout@43cff8f0 

AFAIK, aunque no pude encontrarlo explícitamente, getView () solo se llama para filas visibles. Como mi aplicación comienza con cuatro filas visibles, al menos los números de posición que pasan de 0 a 3 tienen sentido. Pero el rest es un desastre:

  • ¿Por qué se llama a getview para cada fila tres veces?
  • ¿De dónde provienen estas convertViews cuando todavía no me he desplazado?

Hice un poco de investigación, y sin obtener una buena respuesta, me di cuenta de que la gente estaba asociando este problema con problemas de diseño. Entonces, en el caso, aquí está el diseño que contiene la lista:

      

y el diseño de cada fila individual:

       

Gracias por tu tiempo

Esto no es un problema, no hay absolutamente ninguna garantía sobre el orden en que se getView() ni cuántas veces. En su caso particular, está haciendo lo peor posible con un ListView dándole un height=wrap_content . Esto fuerza a ListView a medir algunos niños del adaptador en el momento del diseño, para saber qué tan grande debería ser. Esto es lo que proporciona ListView con las convertViews que ve pasar a getView() incluso antes de desplazarse.

Pruebe con match_parent en la propiedad layout_height de la vista de lista. getView() que getView() se llame con tanta frecuencia.

Me deshice de este problema cuando cambié tanto layout_width como layout_height por match_parent (cambiar solo layout_height no ayudó).


Nota útil, ten cuidado si tienes elementos nesteds. Tienes que cambiar el “más alto” para match_parent . Espero que ayude a alguien.

No puedo responder a su pregunta “Por qué”, pero definitivamente tengo una solución al problema del irritante problema de ” repetición de elementos de ListView ” (si tiene elementos en su colección que son más altos que la altura de la pantalla).

Como muchas personas mencionaron anteriormente, mantenga la propiedad android: layout_height de la etiqueta ListVew como fill_parent .

Y sobre la función getView (), la solución es usar una clase estática llamada ViewHolder . Mira este ejemplo. Realiza con éxito la tarea de agregar todos los elementos en su Array o ArrayCollection.

Espero que esto ayude a los amigos !!

Saludos cordiales, Siddhant

Pregunta: ¿Por qué el adaptador llama a getView () muchas veces? Resp .: A medida que Listview renderiza en el desplazamiento refresca su vista con las próximas vistas siguientes, para lo cual el adaptador necesita obtener vistas llamando a getView ().

Pregunta: ¿Por qué se llama menos si listview ancho y alto se establece en fill_parent? Resp .: como el inflador tiene el tamaño fijo para el área de la pantalla para la lista, se calcula una vez para mostrar las vistas en la pantalla.

Espero que resolverá tu consulta.

Estaba teniendo el mismo problema con el menú desplegable de AutoCompleteTextView. Estuve luchando con el problema durante dos días hasta que llegué aquí y tú me mostraste la solución.

Si escribo dropDownHeight = “match_parent”, el problema es fijo. Ahora el problema está relacionado con la IU (cuando tienes un elemento, el menú desplegable es demasiado grande), pero el problema de las llamadas múltiples (mucho más importante) es fijo.

¡¡Gracias!!

“¿Por qué se llama a getview para cada fila tres veces?” Debido a que se llama a getView cuando se desplaza por listview y para decir mejor, se llama cuando se cambia la posición de una vista de su lista.

Tengo el mismo problema. Si tengo la altura establecida en fill_parent, entonces recibo “normalmente” 2 llamadas por fila. Pero si configuro la altura de mi ListView con el valor exacto, digamos 300 pb, obtengo exactamente una llamada de GetView por fila.

Por lo tanto, me parece que la única forma es primero determinar la altura de la pantalla, luego establecer programáticamente la altura de listvilew a ese valor. No me gusta Espero que haya una mejor manera.

Para todos los que todavía (después de establecer el height del ListView para match_parent ) están bloqueados (como yo):

También debe establecer la height del diseño principal para match_parent .

Vea el ejemplo a continuación. LinearLayout es el padre aquí:

     

Puede que llegue tarde, pero si usa layout_weight recuerde establecer siempre layout_width="0dp"