Sin embargo, otro getView llamado varias veces

Cada elemento en mi ListView contiene un ImageView y un TextView , esto se completará con información remota.

AsyncTask una URL para ImageView , por lo tanto, inicio una AsyncTask que descarga la imagen y llamaremos a setImageBitmap con el bitmap descargado.

Esto va muy bien, pero cuando se crea el ListView, se llama a getView() con frecuencia. Llama a aproximadamente 7 veces el getView para las primeras 10 filas (solo 7 visibles). (Entonces: 0, 1, etc, 10, 0, 1 etc.).

Luego puedo desplazarme sin problemas hasta el décimo elemento. Pero después de eso, para cada nueva fila, la vista de lista vuelve a llamar aproximadamente 7 veces el getView para los primeros 10 elementos. (Esto causará retraso)

Pero cuando setImageBitmap de AsyncTask , ¡todo esto no sucederá!

¿Cual podría ser el problema? ¿Podría ser que algún diseño sea grande lo que causará otra racha de getViews?

Aquí un código:

  

The AsyncTask:

 public static class MyTask extends AsyncTask { private LruCache mMap; private String mUri; private int mPosition; private ViewHolder mHolder; public MyTask (ViewHolder holder, int position, LruCache map) { mMap = map; mHolder = holder; mPosition = position; } @Override protected Bitmap doInBackground(String... url) { mUri = url[0]; return getBitmapFromURL(mUri); } @Override protected void onPostExecute(Bitmap b) { if (b != null) { mMap.put(mUri, b); if (mPosition == mHolder.position) { holder.image.setImageBitmap(b); } } }; } 

getView ()

 row = convertView; ViewHolder holder; if (row == null) { row = vi.inflate(R.layout.mylayout, null); holder = new ViewHolder(); holder.image = (ImageView) row.findViewById(R.id.myimage); holder.title = (TextView) row.findViewById(R.id.mytext); row.setTag(holder); } else { holder = (ViewHolder) row.getTag(); } holder.title.setText("text"); holder.image.setImageResource(R.drawable.mydefaulticon); holder.position = position; startMyTask(content, holder, position); 

Más información:

Cuando se crea una nueva vista, se muestra stacktrace que se llama getView desde ListView.makeAndAddView() pero en la racha inútil de getViews proviene de ListView.measureHeigthOfChildren()

Parece que el diseño cambia cuando configuro el bitmap …

El problema estaba en el diseño de ListView.

El parámetro layout_width se estableció en wrap_content cuando lo cambié a fill_parent el problema desapareció …

Te recomiendo que veas este video http://www.youtube.com/watch?v=wDBM6wVEO70

básicamente, android llamará a getView varias veces para su cálculo de alturas de vista y demás, por lo que debe implementar algún tipo de caché en su asincronía, consulte http://code.google.com/p/android-query/, que tiene eso si no usas autenticación

El problema es que su ListView no sabe cuál es el de cada elemento. Al inicializar, el ListView medirá todos sus elementos secundarios y se basará en esta información. Lo que está haciendo con su AsyncTask, es cambiar los tamaños de los elementos en la lista y no dejar que el ListView dibuje de nuevo por completo. Esto hace que tu ListView se comporte de forma estrangulada.

Solución: debe actualizar su ListView notificando el adaptador utilizando notifyDataSetChanged () en el PostExecute de su AsyncTask. Esto permitirá que ListView se dibuje con la nueva información.

Espero que funcione !

Algunos enlaces útiles:

http://thinkandroid.wordpress.com/2012/06/13/lazy-loading-images-from-urls-to-listviews/

Carga lenta de imágenes en ListView

Lo siento por la respuesta tardía. He estado enfrentando el mismo problema en mi adaptador para el widget de la galería. Yo había empleado Universal Image Loader. La solución de Martijn funcionó para mí. Lo único que tuve que hacer fue agregar notifyDataSetChanged () cuando la imagen se había descargado por completo y se estaba configurando imageView.

Intenté usar fill_parent como alto en ListView, pero no pude lograrlo perfecto, pero como lo intenté evitando la creación de convertViews si ya existe. funciona bien en mi appoach.

  @Override public View getView(final int position, View convertView, ViewGroup parent) { if (convertView != null) return convertView; else { //your code... } }