2015-07-01 4 views
11

Ich habe ListView mit Text und großes Bild aus dem Internet. Mein Bild Item hat Passbreite und wrap_content Höhe.
Ich versuchte, Bild im Hintergrund mit UIL & Picasso anzuzeigen. Beide können arbeiten, aber das Bild immer neu geladen, wenn ich Scrollen zu stoppen, und es macht Listview-Flimmern
Es sieht wie folgt aus:

enter image description hereUIL, Picasso - Bilder im Adapter immer neu laden wenn aufhören zu scrollen

Sie können sehen, dass es heruntergeladen und zwischengespeichert Bilder nachladen, wenn ich aufhören Scrollen (Ich scrolle nach unten und scrolle dann nach oben).
Wie kann ich verhindern, dass dies passiert?

<ImageView android:id="@+id/imgFeed" 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" 
       android:scaleType="centerCrop"/> 

// UIL 
options = new DisplayImageOptions.Builder() 
.showImageOnLoading(defaultImage) 
.showImageOnFail(defaultImage) 
.showImageForEmptyUri(defaultImage) 
.resetViewBeforeLoading(false) 
.cacheOnDisk(true).delayBeforeLoading(0) 
.displayer(new FadeInBitmapDisplayer(200)).cacheInMemory(true).imageScaleType(ImageScaleType.EXACTLY_STRETCHED).build(); 

ImageAware imageAware = new ImageViewAware(viewHolder.imgFeed, false); 
ImageLoader.getInstance().displayImage(item.getPhotoUrl(), imageAware, options); 

// Picasso 
Picasso.with(getContext()) 
         .load(item.getPhotoUrl()) 
         .placeholder(R.drawable.place_holder_big) 
         .resize(screenWidth, 0) //set max width 
         .into(viewHolder.imgFeed); 

Für UIL, habe ich versucht, viele Möglichkeiten, in this issue aber sie funktionieren gar nicht für mich.

Update: scheint ich konfrontiert mit Speicher-Cache-Problem wie this question. Aber wie kann ich dieses Problem beheben? Schau dir die Facebook App an, sie haben es sehr gut gemacht. Alle Bilder haben unterschiedliche Größen mit passender Breite und sehr weiches Scrollen ohne Bilder neu zu laden. Wie können sie das tun?

+0

Welche Version von Android haben Sie getestet? –

+0

Es tritt auf, wenn ich Bilder in benutzerdefinierter Listenansicht mit Bildern und Text herunterlade. Weil die Methode getView für jedes Element aufgerufen wird. Sie müssen Ihre eigene vertikale Scroll-Liste mit Hilfe von scrollview –

+0

@ A.Anderson scheint es für alle Android-Versionen aufgetreten ist. Ich testete auf Android 2.3, 4.4 und 5.0 – R4j

Antwort

4

Wenn Sie sich fragen, wie Facebook es tat, sie tatsächlich ihr Image Laden Bibliothek freigegeben (https://github.com/facebook/fresco)

Ist es möglich, die Sie anrufen tatsächlich notifyDataSetChanged auf dem darunterliegenden Listview zu diesem Zeitpunkt? Verwenden Sie auch hasStableIds()?

Für UIL können Sie versuchen, einen WeakMemoryCache (siehe https://github.com/nostra13/Android-Universal-Image-Loader/wiki/Useful-Info) zu verwenden, da dies theoretisch erlauben wird, den gesamten verfügbaren Speicher zu nutzen, obwohl es viele zusätzliche GC-Aufrufe verursachen kann.

Für Picasso Tahas Methode sieht wie Ihre beste Wette aus!

1

Möglicherweise ist Ihre Speicher-Cache-Größe klein und Picasso versucht, Bilder aus dem Disc-Cache zu laden. Bitte überprüfen Sie here für die Entscheidung Cache-Größe. Sie können versuchen, Cache-Größe von Picasso zu erhöhen von:

Aber meiner Meinung nach Ihre App sieht aus wie mit einem endlosen Feed. Das bedeutet, dass Ihr Speichercache irgendwann voll ist und Sie den Disc-Cache verwenden müssen. Das Abrufen von Daten aus dem Plattencache ist langsamer als der Speichercache.

+0

Ich benutzte beide Plattencache und Speichercache mit UIL, dieses Problem trat immer noch auf (ich habe noch nicht versucht, den Plattencache auf Picasso auszuprobieren, eigentlich weiß ich nicht wie). Aber glauben Sie, dass der Festplatten-Cache funktioniert? – R4j

+0

Ich denke, Sie brauchen einen größeren Speicher-Cache, aber am Ende werden Sie mit Disc-Cache enden, die einige Latenzen führen wird. Erhöhung der Cache-Größe wird dies lösen? Ich bin mir nicht sicher. Möglicherweise tritt das Problem auf, weil die Listenansichtselemente nicht verschrottet werden. Ich meine die Ansichten zu verwerfen. Wie in einer Recycling-Ansicht. – Taha