2013-07-17 14 views
8

Sto usando la libreria Android-Universal-Image-Loader per caricare immagini remote su ImageView nelle mie celle GridView.Android-Universal-Image-Loader non mantiene le immagini caricate sullo scroll in grigliaview

Qui l'configurazioni ImageLoader:

new ImageLoaderConfiguration.Builder(Config.context) 
.threadPriority(Thread.NORM_PRIORITY - 2) 
.memoryCacheSize(20 * 1024 * 1024) // 20 Mb 
.memoryCache(new LruMemoryCache(20 * 1024 * 1024)) 
.defaultDisplayImageOptions(DisplayImageOptions.createSimple()) 
.tasksProcessingOrder(QueueProcessingType.LIFO) 
.enableLogging() // Not necessary in common 
.build(); 

e Opzioni di visualizzazione:

new DisplayImageOptions.Builder() 
.showStubImage(R.drawable.blank) 
.showImageForEmptyUri(R.drawable.no_image) 
.build(); 

I problemi: Una volta che l'attività con l'avvio GridView tutto funziona correttamente e le immagini appare nelle celle, poi Scorro la griglia verso il basso (ho circa 20 articoli nella griglia) e altre immagini si caricano correttamente. Ma una volta scorrere in alto le immagini che sono già state caricate ricominciamo a caricare.

Dopo alcuni cicli di scorrimento in alto e in basso, salva tutte le immagini e non scompaiono più.

Qualcuno ha riscontrato problemi simili o sai cosa ho sbagliato. Grazie per l'aiuto.

AGGIUNTO: Ecco il metodo GetView nel mio adattatore:

@Override 
public View getView(final int position, View convertView, ViewGroup parent) { 

    View view = convertView; 
    ViewHolder holder; 

    if (view == null) {   
     view = Config.context.getLayoutInflater().inflate(R.layout.featured, null); 
     holder = new ViewHolder(); 

     holder.titleText = (TextView) view.findViewById(R.id.featured_title); 
     holder.priceText = (TextView) view.findViewById(R.id.featured_price); 
     holder.image = (ImageView) view.findViewById(R.id.thumbnail_image); 

     view.setTag(holder); 
    } 
    else { 
     holder = (ViewHolder) view.getTag(); 
    } 

    HashMap<String, String> listing = listings.get(position); 

    /* set text values */ 
    holder.titleText.setText(listing.get("title")); 
    holder.priceText.setText(listing.get("price")); 

    /* load image to list (AsyncTask) */ 
    Utils.imageLoaderFeatured.displayImage(listing.get("photo"), holder.image, Utils.imageLoaderOptionsFeatured); 

    return view; 
} 

PS. Fammi sapere se vuoi vedere altro codice (adattatore di rete) per aiutarmi con questo problema.

John

+1

Come si vede, non si utilizza la cache nella memoria né sul disco. Prova ad abilitare la memorizzazione nella cache in Opzioni di visualizzazione. – NOSTRA

+0

L'ho usato prima ma rimosso dopo aver aggiornato la libreria alla versione 1.8.5 a causa di .cacheInMemory() e .cacheOnDisc() sono stati deprecati, anche se le immagini di .cacheInMemory() non vengono mantenute dalla prima volta, l'utente deve scorrere verso l'alto e giù almeno 4 volte prima che l'app memorizzi nella cache tutte le immagini nella griglia. –

+0

Dovresti leggere i documenti Java di quei metodi deprecati. Quindi puoi vedere che dovresti usare '.cacheInMemory (true)' e '.cacheOnDisc (true)'. Vedi il tuo problema nell'app di esempio UIL? – NOSTRA

risposta

16

Ho riscontrato lo stesso problema su Universal-Image-Loader Demo e spero che gli sviluppatori della libreria risolvano il problema nel prossimo aggiornamento.

UPDATE: il problema risolto con l'aiuto di nostra13, è necessario aggiornare la libreria per 1.9 version e utilizzare questo modo di visualizzare le immagini nel imageView:

ImageAware imageAware = new ImageViewAware(imageView, false); 
imageLoader.displayImage(imageUri, imageAware); 

E 'risolto il mio problema. Alcuni dettagli del motivo per cui si dovrebbe fare questo possono essere trovati here e here

+0

Ho provato questo - ma ha creato il problema di visualizzare le immagini già caricate in luoghi di immagini da caricare, invece di mostrare il segnaposto, e dopo un po 'quelle immagini corrette vengono caricate – NarendraJi

1

è necessario utilizzare l'adattatore e quindi implementare la ViewHolder per rendere il flusso di scorrimento uniforme ed efficace. fornire tag alle immagini w.r.t alle loro posizioni fornite in getView() e quindi non ci saranno problemi.

+0

Ciao Anchit, grazie per la tua risposta, ma sto usando viewHolder e ho fatto tutto come hai descritto. Ho aggiunto il metodo getView al post, potrei dare un'occhiata per favore? –

-1

.i è stato anche affrontando lo stesso problema e problema risolto da wirting

Utils.imageLoaderFeatured.displayImage (listing.get ("foto"), titolare .image, Utils.imageLoaderOptionsFeatured); .......

riga interna se (visualizzazione == null) ....... iewhen la visualizzazione convertita == null solo quindi carica le immagini e visualizza. loro .. questo risolverà il tuo problema .....

+1

Grazie amico, ho già provato in questo modo e in questo le immagini dei casi cambiano sempre, significa che si confondono ogni volta che si scorre la griglia. –

0

Lo stesso problema qui, utilizzando un StaggeredGridView. Anche con la cache di memoria e il metodo ImageAware, non è risolto.

L'unica cosa che ha funzionato per me è stata l'espansione della memoria cache da 4 a 10 MB. Le immagini delle liste sono piccole, ma ho un'immagine molto grande come intestazione della vista.

Ho notato che le immagini vengono aggiornate anche con un clic lungo, è valido anche per GridView?

In ogni caso, è stato risolto anche l'ampliamento del limite della cache di memoria.

1

Non utilizzare il tag set nell'adattatore metodo getView(). Cerchiamo sempre di trovare gli ID di vista nel metodo getview() dell'adattatore.

public View getView(final int position, View convertView, ViewGroup parent) { 

View view = convertView; 
ViewHolder holder; 


    view = Config.context.getLayoutInflater().inflate(R.layout.featured, null); 
    holder = new ViewHolder(); 

    holder.titleText = (TextView) view.findViewById(R.id.featured_title); 
    holder.priceText = (TextView) view.findViewById(R.id.featured_price); 
    holder.image = (ImageView) view.findViewById(R.id.thumbnail_image); 

    view.setTag(holder); 



HashMap<String, String> listing = listings.get(position); 

/* set text values */ 
holder.titleText.setText(listing.get("title")); 
holder.priceText.setText(listing.get("price")); 

/* load image to list (AsyncTask) */ 
Utils.imageLoaderFeatured.displayImage(listing.get("photo"), holder.image, Utils.imageLoaderOptionsFeatured); 

return view;} 
+0

Questa mi sembra una buona risposta, ma per favore non chiedete espressamente gli upvotes: se create buoni contenuti, li otterrete in tempo. – halfer

1

È necessario dichiarare l'istanza ImageLoader e DisplayImageOptions una sola 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(); 
Problemi correlati