Tengo un adaptador de lista personalizado:
class ResultsListAdapter extends ArrayAdapter<RecordItem> {
en el método 'getView' anulado, hago una impresión para verificar qué posición es y si es convertView 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, todavía no hay entrada del usuario)
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. Dado que 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 resto es un desastre:
- ¿Por qué se llama a getview para cada fila tres veces?
- ¿De dónde vienen estos convertViews cuando aún no me he desplazado?
Investigué un poco y, sin obtener una buena respuesta, noté que las personas asociaban este problema con problemas de diseño. Entonces, en caso, aquí está el diseño que contiene la lista:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_height="fill_parent"
android:layout_width="fill_parent"
android:orientation="vertical" >
<TextView android:id="@+id/pageDetails"
android:layout_width="fill_parent"
android:layout_height="wrap_content" />
<ListView android:id="@+id/list"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:drawSelectorOnTop="false" />
</LinearLayout>
y el diseño de cada fila individual:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="108dp"
android:padding="4dp">
<ImageView
android:id="@+id/thumb"
android:layout_width="120dp"
android:layout_height="fill_parent"
android:layout_alignParentTop="true"
android:layout_alignParentBottom="true"
android:layout_alignParentLeft="true"
android:layout_marginRight="8dp"
android:src="@drawable/loading" />
<TextView
android:id="@+id/price"
android:layout_width="wrap_content"
android:layout_height="18dp"
android:layout_toRightOf="@id/thumb"
android:layout_alignParentBottom="true"
android:singleLine="true" />
<TextView
android:id="@+id/date"
android:layout_width="wrap_content"
android:layout_height="18dp"
android:layout_alignParentBottom="true"
android:layout_alignParentRight="true"
android:paddingRight="4dp"
android:singleLine="true" />
<TextView
android:id="@+id/title"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:textSize="17dp"
android:layout_toRightOf="@id/thumb"
android:layout_alignParentRight="true"
android:layout_alignParentTop="true"
android:paddingRight="4dp"
android:layout_alignWithParentIfMissing="true"
android:gravity="center" />
</RelativeLayout>
Gracias por tu tiempo
ListView
tiene una altura dewrap_content
, por lo que no está seguro de su altura, por lo tanto, presenta a algunos niños como una especie de probador para ver qué encaja. Cambie suListView
parafill_parent
luego revisar sus registros las llamadas deberían reducirse drásticamente.Pruebe con
match_parent
lalayout_height
propiedad de la vista de lista. EvitarágetView()
que lo llamen con tanta frecuencia.fuente
fill_parent
debe reemplazarsematch_parent
por el nivel de API 8 y superior.Me deshice de este problema cuando cambié tanto layout_width como layout_height por match_parent (cambiar solo layout_height no ayudó).
Nota útil tenga cuidado si tiene elementos anidados. Tienes que cambiar el "más alto" para emparejar_parent . Espero que ayude a alguien.
fuente
wrap_content
, entoncesListView
no sabe cuánto elemento de la lista hay para convertirse en el contenido de la Lista, es por eso queListView
intenta crear tantas filas como cree que son adecuadas para mostrar, y cuando usafill_parent
omatch_parent
,ListView
piensa, está bien, mi altura esx
y necesito unn
número de filas para mostrar.No puedo responder a su pregunta "Por qué", pero definitivamente tengo una solución al problema del problema irritante " Repetición de elementos de ListView " (si tiene elementos en su colección que superan la altura de la pantalla).
Como muchas personas han mencionado anteriormente, mantener el androide: layout_height propiedad del ListVew etiqueta 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 amigos !!
Saludos cordiales, Siddhant
fuente
GridView
y cambiarandroid:layout_height
yandroid:layout_width
no funciona para mí. Pero usandoViewHolder
imágenes repetidas fijas para mí, reviséQues: ¿Por qué Adaptador llama a getView () muchas veces? Respuesta: A medida que Listview se muestra en el desplazamiento, se actualiza su vista con las próximas vistas, para las cuales el adaptador necesita obtener vistas llamando a getView ().
Ques: ¿Por qué las llamadas son menores si el ancho y la altura de la vista de lista se establecen en fill_parent? Respuesta: Debido a que el inflador tiene el tamaño fijo para el área de pantalla para la lista, se calcula una vez para representar las vistas en la pantalla.
Espero que resuelva su consulta.
fuente
Estaba teniendo el mismo problema con el menú desplegable en AutoCompleteTextView. Estuve luchando con el problema durante dos días hasta que llegué aquí y me muestras la solución.
Si escribo dropDownHeight = "match_parent", el problema se soluciona. Ahora el problema está relacionado con la interfaz de usuario (cuando tiene un elemento, el menú desplegable es demasiado grande), pero el problema de las llamadas múltiples (mucho más importante) está solucionado.
¡¡Gracias!!
fuente
"¿Por qué se llama a getview para cada fila tres veces?" ¡Porque se llama a getView cuando se desplaza en la vista de lista y para decir mejor que cuando se cambia la posición de una vista de su lista!
fuente
Tengo el mismo problema. Si tengo la altura establecida en fill_parent, entonces recibo "generalmente" 2 llamadas por fila. Pero, si configuro la altura de mi ListView al valor exacto, digamos a 300dp, entonces obtengo exactamente una llamada GetView por fila.
Entonces, me parece que la única forma es primero determinar la altura de la pantalla, luego establecer programáticamente la altura de listvilew en ese valor. No me gusta Espero que haya una mejor manera.
fuente
Para todos ustedes que todavía (Después de ajustar el
height
de laListView
amatch_parent
) está atascado (como yo):También debe establecer el
height
diseño primario enmatch_parent
.Ver ejemplo a continuación. El
LinearLayout
es el padre aquí:fuente
Esto puede llegar tarde, pero si está utilizando
layout_weight
recuerde configurar siemprelayout_width="0dp"
fuente
Hice esta solución, tal vez no sea la mejor, pero funciona ...
entonces =
¡Espero eso ayude!
fuente