Carga perezosa en ListView con imagen. (Adaptador de cursor)

Tengo una vista de lista que muestra videos con su imagen en miniatura, estoy utilizando el adaptador de cursor (Fetches utilizando ContentProvider). El problema es que el número de elementos de la lista aumenta el rendimiento de la vista de la lista, haciéndose muy pobre. Por favor, hágamelo saber la mejor manera de hacerla carga perezosa.

Nuevo: Finalmente tengo una solución. Está funcionando bien para mí. Por favor, hágamelo saber si tiene algún consejo. Mi nuevo código está aquí. (Utiliza la pila con el productor Patern del consumidor y el hilo del bacground para proccesing)

@Override public void bindView (Vista de vista, Contexto contextual, Cursor cursor) {

ViewHolder holder = (ViewHolder) view.getTag(); String name = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Video.Media.TITLE)); int id = cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Video.Media._ID)); holder.getIdView().setText(name); holder.getThumbView().setTag((Integer)id); if(LazyLoader.getInstance().containsKey(id)) { Object bitmap = LazyLoader.getInstance().getBitMap(id); if(null != bitmap && (bitmap instanceof Bitmap)) { holder.getThumbView().setImageBitmap((Bitmap)bitmap); } else { holder.getThumbView().setImageDrawable(null); } } else { holder.getThumbView().setImageDrawable(null); LazyItem lazyItem = new LazyItem(); lazyItem.setId(id); lazyItem.setThumbNail(holder.getThumbView()); LazyLoader.getInstance().putItem(lazyItem); } } public class LazyLoaderHelper extends Thread { private ContentResolver resolver = null; private Activity activity; private boolean isActive = true; ExecutorService executor; public LazyLoaderHelper(Activity _activity , ContentResolver _resolver) { resolver = _resolver; activity = _activity; isActive = true; executor = Executors.newFixedThreadPool(10); } public void stopThread() { isActive = false; executor.shutdown(); } @Override public void run() { while (isActive) { if(LazyLoader.getInstance().getSize() > 0) { final LazyItem lazyItem = LazyLoader.getInstance().getItem(); if(null != lazyItem) { executor.execute(new Runnable() { @Override public void run() { BitmapFactory.Options options = new BitmapFactory.Options(); options.inSampleSize = 1; if ((null != resolver) && (null != activity)) { final Bitmap thumb = MediaStore.Video.Thumbnails.getThumbnail(resolver, lazyItem.getId(), MediaStore.Video.Thumbnails.MICRO_KIND, options); if (null != thumb) { LazyLoader.getInstance().putBitMap(lazyItem.getId(), thumb); } else { LazyLoader.getInstance().putBitMap(lazyItem.getId(), new Object()); } if ((Integer) lazyItem.getThumbNail().getTag() == lazyItem.getId()) { activity.runOnUiThread(new Runnable() { @Override public void run() { if (null != thumb) { lazyItem.getThumbNail().setImageBitmap(thumb); } else { lazyItem.getThumbNail().setImageDrawable(null); } } }); } } } }); } } } } } 

Usted puede utilizar la biblioteca de picaso para android es de código abierto y puede integrarse fácilmente con en su aplicación se puede descargar la biblioteca de github desde abajo enlace

http://square.github.io/picasso/

Y puede implementar fácilmente la carga perezosa mediante el uso de los siguientes métodos en su adaptador de vista de lista

Picasso admite marcadores de posición de descarga y error como características opcionales.

Picasso.with (contexto) .load (url) .placeholder (R.drawable.user_placeholder) .error (R.drawable.user_placeholder_error) .into (imageView);

Recursos, recursos, archivos, proveedores de contenido son compatibles como fuentes de imagen.

Picasso.with (contexto) .load (R.drawable.landing_screen) .into (imageView1); Picasso.with (contexto) .load ("file: ///android_asset/DvpvklR.png") .into (imageView2); Picasso.with (context) .load (nuevo Archivo (…)). En (imageView3);

Varias bibliotecas están disponibles para la carga perezosa de la imagen. Picasso & Glide son muy buenos. La integración también es muy fácil. Puede utilizar Picasso si la calidad de la imagen es más importante. Utilice deslizamiento para una carga más rápida. Aunque usted puede preferir cualquier persona, recomiendo usar Glide.

Para las imágenes intercambiadas puede haber un problema en la carga asíncrona de las imágenes. ¿Cómo sabes acerca de la terminación del hilo. Cualquier hilo puede cargar imagen en cualquier momento.

Gracias

  • Estoy utilizando la biblioteca aQuery para la carga perezosa de los mapas de bits (también es compatible con http). Es muy simple y fácil de integrar con el código existente sin hacer muchos cambios.
  • Mantenga la disposición de los artículos tan simple como sea posible.
  • Asegúrese de implementar correctamente el reciclado y el patrón Ver y Ver .

Más información sobre el desplazamiento de lista suave está aquí

En mi opinión, usted debe probar el UIL (Universal Image Loader) que lib puede mostrar miniaturas de vídeo, así como miniaturas de imagen.

Editar: Añadir imageLoader.displayImage(String uri, ImageView imgView, DisplayImageOptions options); A su getView de su custom adapter

String uri puede ser file:///mnt/sdcard/video.mp4 // de la tarjeta SD (miniatura de vídeo)

¡Espero que esto ayude! Si tiene algún problema, por favor comente a continuación

Le recomiendo que combine el patrón de ViewHolder con la biblioteca llamada Picasso .

Al cargar la imagen, picasso se parece a:

 public static class ViewHolder { ... public ImageView imageView; } @Override public void bindView(View view, Context context, Cursor cursor) { ... String thumbnailURL = "image_url_from_cursor"; Picasso.with(context).load(thumbnailURL) .placeholder(R.drawable.ic_default_img) .error(R.drawable.ic_default_img) .into(holder.imageView); ... 

Espero eso ayude.

Para usar la carga perezosa es bueno, pero aún así yo prefiero la biblioteca de Picasso android, que configurará automáticamente el requisito de caché y tomará menos tiempo para la carga de imágenes también. Estoy usando el adaptador de paginación para ver la animación del paginador y aquí necesité número de imágenes para esto Propósito para diferentes-diferentes páginas. Aquí está el ejemplo para esto.

  public Object instantiateItem(ViewGroup container, int position) { final ViewGroup cnt=container; final int val=position; View itemView = mLayoutInflater.inflate(R.layout.smallnewsview, container, false); try { ImageView img=(ImageView)itemView.findViewById(R.id.imageView1); Picasso.with(context) .load("just image url....") .into(img, new Callback() { @Override public void onSuccess() { pbh.setVisibility(View.GONE); } @Override public void onError() { pbh.setVisibility(View.VISIBLE); } }); 

Ahora para la próxima vez que automáticamente llamará caché en lugar de servidor de cada vez. Me gusta mucho esta biblioteca.

Aquí usted puede conseguir la biblioteca también.

http://square.github.io/picasso/

Espero que esto sea muy útil para su amable apoyo.

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.