6

Nel mio progetto Android sto mostrando tutte le immagini dalla web service(Url)-ListView per questo scopo ho utilizzato Universal image loader. Dopo aver caricato alcune immagini in Elenco se ho fatto scorrere verso il basso, quindi ho fatto scorrere Su, Le immagini già caricate si stanno ricaricando di nuovo.Listview caricando le immagini già caricate utilizzando Universale immagine loader

DisplayImageOptions.Builder displayImageOptionsBuilder = new DisplayImageOptions 
        .Builder().cacheOnDisk(true).cacheInMemory(true).considerExifParams(true); 


ImageLoader.getInstance().displayImage(imageUri, imageView, 
        displayImageOptionsBuilder.build()); 

Quello che ho cercato

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

Anche usato questo codice non avrebbe alcuna modifica in ListView reloading

cura

Classe adattatore

@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); 
      } 
     } 
    } 

cura adattatore classe secondo Dhir Prataprisposta

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; 

    } 

} 
+0

la tua domanda non è chiara ... come hai utilizzato ImageLoader in getView di Adapter? Quanto sono grandi le immagini (è importante in quanto i caricatori di immagini possono rilasciare bitmap memorizzate nella cache quando la memoria è bassa - quindi deve caricarlo dalla cache del disco o anche da Internet (vedere la prossima domanda))? Inoltre, il server utilizza l'e-tag (o altre intestazioni di cache)? – Selvin

+0

@Selvin Ho modificato la mia domanda anche con il metodo getView() della classe Adapter. – Jamal

+0

Le dimensioni delle immagini sono diverse, ogni immagine ha le proprie dimensioni. Sono probabilmente 14,1 kb, 13,2 kb, 27 kb, 23,4 kb, 11 kb, ecc. – Jamal

risposta

12

Ci sono alcune correzioni si può fare

  1. Il vostro supporto vista è quasi inutile. Devi usare come seguire

    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. Si dovrebbe dichiarare l'istanza ImageLoader e DisplayImageOptions solo una volta. Probabilmente in costruttore.

    ImageLoader imageLoader = ImageLoader.getInstance(); 
    DisplayImageOptions options = new DisplayImageOptions.Builder().cacheInMemory(true) 
         .cacheOnDisc(true).resetViewBeforeLoading(true) 
         .showImageForEmptyUri(fallbackImage) 
         .showImageOnFail(fallbackImage) 
         .showImageOnLoading(fallbackImage).build(); 
    
  3. Nella vista get basta caricare l'immagine come seguire

Edit: non avevo usato ImageAware. Devi usare così.

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

The answer qui dice che questa in effetti è stato un problema con l'UIL che è stato risolto nella versione 1.9.

Edit 2: Ho seguito la discussione sulla questione a Github e trovò this answer che fa controllo manuale su l'URL dell'immagine. Si suggerisce di effettuare le seguenti operazioni

//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); 
    } 
+1

Dhir Pratap, ho provato il tuo codice ma ancora quel problema accade. Il metodo 'cacheOnDisc (true)' è 'deprecato' quindi ho provato anche con' cacheOnDisk (true) ' – Jamal

+0

Puoi aggiornare la domanda con le modifiche quindi posso guardare oltre. –

+0

Ho aggiornato la mia classe 'Adapter' – Jamal

0

Ho lo stesso problema. Mettere il file ApplicationClass.java nella cartella src e registrarlo nel file manifest risolverà il tuo problema.

Ecco entrambi i file:

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 
    } 
} 

file di manifesto:

<?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> 

Spero che questo vi aiuterà.

Problemi correlati