Listview recarga las imágenes ya cargadas mediante el cargador de imágenes Universal

En mi proyecto de Android estoy mostrando todas las imágenes de web service(Url) a ListView para este propósito he utilizado Universal image loader . Después de haber cargado algunas imágenes en la Lista si me desplázate hacia abajo, luego desplázate hacia arriba, las imágenes ya cargadas se están recargando de nuevo.

  DisplayImageOptions.Builder displayImageOptionsBuilder = new DisplayImageOptions .Builder().cacheOnDisk(true).cacheInMemory(true).considerExifParams(true); ImageLoader.getInstance().displayImage(imageUri, imageView, displayImageOptionsBuilder.build()); 

Lo que intenté

 ImageAware imageAware = new ImageViewAware(imageView, false); ImageLoader.getInstance().displayImage(imageUri, imageAware,displayImageOptionsBuilder.build()); 

Incluso usó este código que no haría ningún cambio en la reloading ListView

Editado

Clase del Adaptador

 @Override public View getView(int position, View convertView, ViewGroup parent) { final String name = getItem(position); View view = convertView; if (view == null) { view = createView(); ViewHolder viewHolder = new ViewHolder(); viewHolder.image = (ImageView) view.findViewById(R.id.capsule_media_list_item_thumbnail_1); view.setTag(viewHolder); } ImageHelper.initImage(viewHolder.image, imageUrl, R.drawable.vx_loading, loadingImageResource,displayOptionsCustomizer); return view; } private final DisplayOptionsCustomizer displayOptionsCustomizer = new DisplayOptionsCustomizer() { @Override public void customizeImageOptions(DisplayImageOptions.Builder displayImageOptionsBuilder) { displayImageOptionsBuilder.displayer(new RoundedBitmapDisplayer(ApplicationUtils .dipToPixelsRounded(6, getContext()), 0)); } }; static class ViewHolder { public ImageView image; } 

ImageHelper.java

 public static void initImage(final ImageView imageView, final String imageUri, final int noImageResource, final int loadingImageResource, final DisplayOptionsCustomizer displayOptionsCustomizer) { if (StringUtils.isNotBlank(imageUri)) { DisplayImageOptions.Builder displayImageOptionsBuilder = new DisplayImageOptions .Builder().cacheOnDisk(true).cacheInMemory(true).considerExifParams(true); displayImageOptionsBuilder.showImageOnLoading(loadingImageResource) .showImageOnFail(noImageResource); if (displayOptionsCustomizer != null) { displayOptionsCustomizer.customizeImageOptions(displayImageOptionsBuilder); } ImageLoader.getInstance().displayImage(imageUri, imageView, displayImageOptionsBuilder.build()); } else { if (noImageResource != 0) { imageView.setImageResource(noImageResource); } else { imageView.setVisibility(View.GONE); } } } 

Editado Adaptador según la respuesta de Dhir Pratap

 public class ImagesListAdapter extends ArrayAdapter<String> { private List imagesList = new ArrayList<String>(); private Context context; ImageLoader imageLoader; DisplayImageOptions options; public ImagesListAdapter(Context context, List<String> imagesList) { super(context, -1,imagesList); this.imagesList = imagesList; this.context = context; imageLoader = ImageLoader.getInstance(); options = new DisplayImageOptions.Builder().cacheInMemory(true) .cacheOnDisk(true).resetViewBeforeLoading(true) .showImageForEmptyUri(fallbackImage) .showImageOnFail(fallbackImage) .showImageOnLoading(fallbackImage).build(); } @Override public View getView(int position, View convertView, ViewGroup parent) { final String name = getItem(position); View view = convertView; ViewHolder viewHolder; if (view == null) { view = createView(); viewHolder = new ViewHolder(); viewHolder.image = (ImageView) view.findViewById(R.id.capsule_media_list_item_thumbnail_1); view.setTag(viewHolder); } else{ viewHolder = (ViewHolder) view.getTag(viewHolder); } /*ImageHelper.initImage(viewHolder.image, imageUrl, R.drawable.vx_loading, loadingImageResource,displayOptionsCustomizer);*/ imageLoader.displayImage(imageUrl,viewHolder.image, options); return view; } /* private final DisplayOptionsCustomizer displayOptionsCustomizer = new DisplayOptionsCustomizer() { @Override public void customizeImageOptions(DisplayImageOptions.Builder displayImageOptionsBuilder) { displayImageOptionsBuilder.displayer(new RoundedBitmapDisplayer(ApplicationUtils .dipToPixelsRounded(6, getContext()), 0)); } }; */ static class ViewHolder { public ImageView image; } } 

Hay pocas correcciones que puedas hacer

  1. Su visor es casi inútil. Tienes que usarlo como sigue

     ViewHolder viewHolder; if (view == null) { viewHolder = new ViewHolder(); viewHolder.image = (ImageView) view.findViewById(R.id.capsule_media_list_item_thumbnail_1); view.setTag(viewHolder); }else{ viewHolder = view.getTag(viewHolder); } 
  2. Debe declarar la instancia de ImageLoader y DisplayImageOptions sólo una vez. Probablemente en constructor.

     ImageLoader imageLoader = ImageLoader.getInstance(); DisplayImageOptions options = new DisplayImageOptions.Builder().cacheInMemory(true) .cacheOnDisc(true).resetViewBeforeLoading(true) .showImageForEmptyUri(fallbackImage) .showImageOnFail(fallbackImage) .showImageOnLoading(fallbackImage).build(); 
  3. En la vista de obtener simplemente cargar la imagen como sigue

Edit: No había utilizado ImageAware. Tienes que usarlo así.

 ImageAware imageAware = new ImageViewAware(viewHolder.image, false); imageLoader.displayImage(imageUri, imageAware,options); 

La respuesta aquí dice que esto realmente fue un problema con el UIL que fue corregido en la versión 1.9.

Editar 2: Seguí la discusión sobre el tema en Github y encontré esta respuesta que hace la comprobación manual en la url de la imagen. Sugiere hacer lo siguiente

 //lets prevent "blinking" by "saving URL tag" hack if (viewHolder.image.getTag() == null || !viewHolder.image.getTag().equals(imageUri)) { //we only load image if prev. URL and current URL do not match, or tag is null ImageAware imageAware = new ImageViewAware(viewHolder.image, false); imageLoader.displayImage(imageUri, imageAware,options); viewHolder.image.setTag(imageUri); } 

Tengo el mismo problema. Poner el archivo ApplicationClass.java en la carpeta src y registrarlo en el archivo de manifiesto resolverá su problema.

Aquí están los dos archivos:

ApplicationClass.java

 package yourPackageName; import android.app.Application; import com.nostra13.universalimageloader.cache.memory.impl.WeakMemoryCache; import com.nostra13.universalimageloader.core.DisplayImageOptions; import com.nostra13.universalimageloader.core.ImageLoader; import com.nostra13.universalimageloader.core.ImageLoaderConfiguration; import com.nostra13.universalimageloader.core.assist.ImageScaleType; import com.nostra13.universalimageloader.core.display.FadeInBitmapDisplayer; public class ApplicationClass extends Application { @Override public void onCreate() { super.onCreate(); // UNIVERSAL IMAGE LOADER SETUP DisplayImageOptions defaultOptions = new DisplayImageOptions.Builder().cacheOnDisc(true).cacheInMemory(true) .imageScaleType(ImageScaleType.EXACTLY).displayer(new FadeInBitmapDisplayer(300)).build(); ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(getApplicationContext()) .defaultDisplayImageOptions(defaultOptions).memoryCache(new WeakMemoryCache()) .discCacheSize(100 * 1024 * 1024).build(); ImageLoader.getInstance().init(config); // END - UNIVERSAL IMAGE LOADER SETUP } } 

Archivo de manifiesto:

  <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="yourPackageName"> <!--Permissions --> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <application android:name="com.webcluesinfotech.loadimagefromurlinlistview.ApplicationClass" android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:supportsRtl="true" android:theme="@style/AppTheme"> <activity android:name=".MainActivity" android:label="@string/app_name" android:theme="@style/AppTheme.NoActionBar"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest> 

Espero que esto te ayudará.

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