El desplazamiento de ListView con UniversalImageDownloader no es suave

Estoy usando un ListView que contiene imágenes. Estas imágenes se cargan desde Internet dentro del adaptador. Por lo tanto, estoy usando el UniversalImageDownloader .

Desafortunadamente, el desplazamiento de los "retrasos" de ListView por un corto tiempo tan pronto como desplazo hacia abajo donde el nuevo contenido tiene que ser descargado.

I acutally esperaba que el comportamiento como el ListView scrolls perfectamente suave, pero la carga de la imagen puede tomar un poco más de tiempo – que no debería afectar la suavidad de desplazamiento.

Además, al desplazarme hacia atrás, también se producen los retrasos. Parece como si las imágenes no se almacenan en caché correctamente.

Tal vez mis opciones de ImageLoader están mal configuradas?

¿Estoy haciendo algo mal en mi adaptador?

El ListView contiene aproximadamente 20-30 imágenes con tamaños 640×320 (alrededor de 150kb)

Debajo de usted puede ver mi adaptador así como el ImageLoader. (La clase Downloader es sólo una clase de contenedor para UniversalImageDownloader)

public class Downloader { /** * initializes the imagedownloader with a specific configuration * I CALL THIS METHOD RIGHT AFTER APP STARTUP * @param c */ public static void initialize(Context c) { // Create global configuration and initialize ImageLoader with this configuration ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(c) .threadPoolSize(20) .threadPriority(Thread.NORM_PRIORITY) // default .tasksProcessingOrder(QueueProcessingType.FIFO) // default .memoryCacheSize(20 * 1024 * 1024) .memoryCacheSizePercentage(15) // default .discCacheSize(20 * 1024 * 1024) .discCacheFileCount(100) .discCacheFileNameGenerator(new HashCodeFileNameGenerator()) // default .imageDecoder(new BaseImageDecoder()) // default .build(); ImageLoader.getInstance().init(config); } /** * gets the display options that are needed when displaying an image * @return */ public static DisplayImageOptions getDisplayOptions() { DisplayImageOptions options = new DisplayImageOptions.Builder() .showImageForEmptyUri(R.drawable.error) .showImageOnFail(R.drawable.error) .resetViewBeforeLoading(false) // default .cacheInMemory(true) // default .cacheOnDisc(true) // default .build(); return options; } public static ImageLoader getInstance() { return ImageLoader.getInstance(); } } 

Y el adaptador:

 public class EventListAdapter extends ArrayAdapter<Event> { private List<Event> mList; private DisplayImageOptions options; public EventListAdapter(Context context, int list_item_resource, List<Event> objects) { super(context, list_item_resource, objects); mList = objects; options = Downloader.getDisplayOptions(); } @Override public View getView(int position, View convertView, ViewGroup parent) { Event event = mList.get(position); // A ViewHolder keeps references to children views to avoid unneccessary calls to findViewById() on each row. ViewHolder holder = null; if (convertView == null) { LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); convertView = inflater.inflate(R.layout.normalevent_list_item, parent, false); holder = new ViewHolder();; holder.eventimage = (ImageView) convertView.findViewById(R.id.ivEventImage); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } if (event != null) { holder.eventimage.setImageResource(R.drawable.loading); // Load image, decode it to Bitmap and display Bitmap in ImageView Downloader.getInstance().displayImage(event.getImageOneURL(), holder.eventimage, options); } return convertView; } private static class ViewHolder { ImageView eventimage; } } 

2 Solutions collect form web for “El desplazamiento de ListView con UniversalImageDownloader no es suave”

Tuve el mismo problema con la descarga de imágenes. Lo solucioné poniendo delayBeforeLoading (1000) en mi DisplayImageOptions. Es necesario iniciar la descarga cuando el usuario deje de jugar.

Así que trate de reemplazar su método getDisplayOptions con este

  public static DisplayImageOptions getDisplayOptions() { DisplayImageOptions options = new DisplayImageOptions.Builder() .showImageForEmptyUri(R.drawable.error) .showImageOnFail(R.drawable.error) .delayBeforeLoading(1000) .resetViewBeforeLoading(false) // default .cacheInMemory(true) // default .cacheOnDisc(true) // default .build(); return options; } 

La documentación también recomienda utilizar este código para evitar retrasos de desplazamiento de vista de cuadrícula / lista

 boolean pauseOnScroll = false; // or true boolean pauseOnFling = true; // or false PauseOnScrollListener listener = new PauseOnScrollListener(imageLoader, pauseOnScroll, pauseOnFling); listView.setOnScrollListener(listener); 

Puede leerlo aquí (el último elemento de la lista "Información útil")

Así que puedes usar uno de estos métodos

@Sergey Pekar: ¡Usted me salvó la vida! 🙂 Siempre he utilizado UIL para ListView para una pequeña cantidad de imágenes, pero luego como el conteo se hizo más grande que siempre un retraso en la primera carga (mientras se desplaza) de las imágenes. Así que también intenté el retraso y ayudó un poco y otras configuraciones UIL y opciones, pero no estaba contento. Entonces he intentado diferentes Image-Loading-Libraries (Picasso, AQuery, Volley, UrlImageViewHelper, código personalizado). Todos trabajaron más rápido (en primera carga) que UIL, pero no tenían suficientes opciones para mí. Así que busqué los últimos 2 días para una solución con respecto a este problema de retraso y thanx Dios que finalmente encontró su mensaje aquí! La solución fue el PauseOnScrollListener!

Lo que también (addtionally a la PauseOnScrollListener) mejora un poco la suavidad de desplazamiento es mediante la ampliación de ImageView para detener requestLayout como esto:

 public class CustomImageView extends ImageView { public CustomImageView (Context context, AttributeSet attributeset, int int_style) { super(context, attributeset, int_style); } public CustomImageView (Context context, AttributeSet attributeset) { super(context, attributeset); } public CustomImageView (Context context) { super(context); } @Override public void requestLayout() { // Do nothing here } } 

Para más información vea este post:
ListView muy lento al desplazarse (usando ViewHolder / reciclado)

  • Cargador de imágenes universal no funciona
  • Cómo utilizar Universal Image Loader para cargar recursos localmente
  • Uso de Android-UIL, ¿Cómo detener la descarga?
  • ¿Es posible establecer ImageSize con displayImage ()?
  • Relación de mantenimiento del cargador de imágenes universal
  • Universal Image Loader con 2 visualizadores
  • Compartir Imagen elemento de transición tamaño incorrecto
  • ¿Cómo puedo descargar la imagen con universal-image-loader
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.