java - example - listview desplegable android studio
adaptador de vista de lista personalizado Se llama al método getView varias veces, y en un orden no coherente (9)
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 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 resto 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:
<?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
"¿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.
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!!
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.
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 anidados. 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 this 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
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í:
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/something" />
<ListView
android:id="@+id/friendsList"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
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.
Pruebe con match_parent
en la propiedad layout_height
de la vista de lista. getView()
que getView()
se llame con tanta frecuencia.
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.