ListView es muy lento – android

Quiero mostrar imágenes desde el directorio de recursos (todos ellos se guardan en formato png) en mi ListView , pero es extremadamente laggy. Soy un noob completo, así que necesito ayuda con las tareas asíncronas para eliminar los retrasos.

Adaptador de lista:

  public class MyListAdapter extends ArrayAdapter < SettingsItem > { Context context; List < SettingsItem > items; public MyListAdapter(Context context, int resource, List < SettingsItem > objects) { super(context, resource, objects); this.context = context; items = objects; } @Override public View getView(int position, View itemView, ViewGroup parent) { ViewHolder holder; if (itemView == null) { LayoutInflater inflater = ((Activity) context).getLayoutInflater(); itemView = inflater.inflate(R.layout.settings_items, parent, false); holder = new ViewHolder(); holder.imageView = (ImageView) itemView.findViewById(R.id.item_icon); holder.textView = (TextView) itemView.findViewById(R.id.item_text); itemView.setTag(holder); } else { holder = (ViewHolder) itemView.getTag(); } SettingsItem settingsItem = items.get(position); if (settingsItem != null) { holder.textView.setText(settingsItem.getName()); new ImageDownloaderTask(holder.imageView, getContext(), settingsItem.getIcon_id()).execute(); } return itemView; } static class ViewHolder { ImageView imageView; TextView textView; } } 

Clase de fila:

 public class SettingsItem{ private String name; private int icon_id; public SettingsItem(String a, int b){ super(); name=a; icon_id=b; } public String getName() { return name; } public int getIcon_id() { return icon_id; } } 

AsyncTask:

 class ImageDownloaderTask extends AsyncTask<String, Void, Bitmap> { private final WeakReference<ImageView> imageViewReference; Context context; int id; public ImageDownloaderTask(ImageView imageView, Context context, int id) { imageViewReference = new WeakReference<ImageView>(imageView); this.context=context; this.id=id; } @Override protected Bitmap doInBackground(String... params) { return BitmapFactory.decodeResource(context.getResources(),id ); } @Override protected void onPostExecute(Bitmap bitmap) { if (isCancelled()) { bitmap = null; } if (imageViewReference != null) { ImageView imageView = imageViewReference.get(); if (imageView != null) { if (bitmap != null) { imageView.setImageBitmap(bitmap); } else { imageView.setImageResource(R.drawable.medical_bag); } } } } } 

Realmente necesito ayuda con esto.
Gracias por adelantado. 🙂

Para crear listas complejas en sus aplicaciones, puede utilizar el RecyclerView. Obtenga más información sobre la vista de reciclador en https://developer.android.com/training/material/lists-cards.html .

Para visualizar imágenes, utilice glide. https://github.com/bumptech/glide . Es una biblioteca impresionante que hace toda la gestión de memoria para usted. Cargar mapas de bits en la vista de imágenes es un poco doloroso.

Yo recomendaría que utilice la biblioteca Glide , esto traería obtener rendimiento a la carga de imágenes en su aplicación y su muy fácil de usar. Soporta la captura, decodificación y visualización de imágenes de vídeo, imágenes y GIF animados.

Hace desplazamiento de cualquier tipo de una lista de imágenes tan suave y rápido como sea posible, pero Glide también es eficaz para casi cualquier caso en el que tiene que buscar, cambiar el tamaño y mostrar una imagen remota.

Glide es un marco de carga y gestión de imágenes de código abierto rápido y eficiente para Android que envuelve la decodificación de medios, la memoria y el almacenamiento en caché de disco y la agrupación de recursos en una interfaz sencilla y fácil de usar.

Agregar Glide a su proyecto:

 dependencies { compile 'com.github.bumptech.glide:glide:3.6.0' compile 'com.android.support:support-v4:19.1.0' } 

Para un uso de vista de lista de la página oficial es como a continuación:

 @Override public View getView(int position, View recycled, ViewGroup container) { final ImageView myImageView; if (recycled == null) { myImageView = (ImageView) inflater.inflate(R.layout.my_image_view, container, false); } else { myImageView = (ImageView) recycled; } String url = myUrls.get(position); Glide.with(myFragment) .load(url) .centerCrop() .placeholder(R.drawable.loading_spinner) .crossFade() .into(myImageView); return myImageView; } 

Para hacer referencia a otro proyecto que utiliza esta biblioteca para cargar más rápido la imagen y mejorar el desplazamiento: https://github.com/chrisbanes/cheesesquare

Puede utilizar la memoria caché para tener una visualización más rápida. Estoy utilizando picasso http://square.github.io/picasso es muy útil para mostrar fácilmente las imágenes y manejar la memoria caché. Espero eso ayude.

 Picasso.with(context).load("file:///android_asset/DvpvklR.png").into(imageView2); 
  • La aplicación será lenta cuando el número de vanos aumenta
  • Por qué la creación de AssetManager toma demasiado tiempo para cargar que hacen que la aplicación comience lenta
  • ¿Es Hibernate un exceso para una aplicación de Android?
  • Por qué getSpeed ​​() siempre devuelve 0 en android
  • Android Studio generado APK se bloquea al ejecutar la aplicación en el mismo teléfono funciona bien. ¿Qué está mal?
  • Api de rendimiento de Android nivel 11 y superior
  • Android Studio demasiado lento y laggy
  • Androide. ¿Cómo mejorar el rendimiento de Eclipse para proyectos con muchos recursos?
  • Inicio La actividad es lenta y la nueva actividad está vacía
  • ¿Android NDK da aceleración para enviar int sobre sockets?
  • Android Studio Toma mucho tiempo para ejecutar la aplicación en un dispositivo real
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.