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. 🙂
- ¿Cómo almacenar en caché y almacenar objetos y establecer una política de expiración en android?
- Buenas prácticas para ordenar una lista con una de las cuatro reglas
- ¿Por qué son las anotaciones bajo Android un problema de rendimiento (lento)?
- CREOOrUpdate de ORMLite parece lento - ¿cuál es la velocidad normal?
- Boot complete broadcast procesado en serie en KITKAT 4.4.2 <ACTION_BOOT_COMPLETED> <ActivityManagerService.java>
- Optimización de las aplicaciones de Android
- Aumentar la velocidad de desarrollo de Android
- Cargar mapa de bits o dibujar gráfico? Pregunta de rendimiento
- Androide WebView alternativa para webapps
- Android webview rendimiento, ¿qué me falta?
- Desplazamiento rápido personalizado pulgar
- Cómo medir FPS en Android durante el desarrollo de aplicaciones
- Temas de Android: FinalizerWatchDogDaemon
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);
- Android HttpsUrlConnection javax.net.ssl.SSLException La conexión se cerró por el error del apretón de manos del par al usar el truststore local
- No se puede actualizar la vista, el enlace de datos no funciona – Angularjs y PhoneGap