2015-07-01 33 views
11

Mam ListView z tekstem i dużym obrazem z Internetu. Mój element obrazu ma szerokość pasowania i wysokość wrap_content.
Próbowałem wyświetlić obraz w tle za pomocą UIL & Picasso. Oba z nich może pracować, ale obraz zawsze ładuje kiedy zatrzymać przewijanie, a to sprawia, że ​​ListView migotanie
Wygląda to tak:

enter image description hereUIL, Picasso - Obrazy w adapterze zawsze przeładowują się po zatrzymaniu przewijania

Widać, że go przeładować pobrane i buforowane obrazów kiedy zatrzymać przewijanie (Przewijam w dół, a następnie przewijam w górę).
Jak mogę temu zapobiec?

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

Dla UIL, próbowałem wiele sposobów, w this issue ale one nie działają na mnie w ogóle.

Aktualizacja: wydaje mi się, że mam do czynienia z problemem pamięci podręcznej, takim jak this question. Ale jak mogę rozwiązać ten problem? Popatrz na aplikację na Facebooku, zrobili to bardzo dobrze. Wszystkie obrazy mają różne rozmiary z dopasowaną szerokością i bardzo płynne przewijanie bez ponownego ładowania obrazów. Jak mogą to zrobić?

+0

Którą wersję Androida testujesz? –

+0

Występuje, gdy pobieranie obrazów w niestandardowym widoku listy z obrazami i tekstem. Ponieważ metoda getView jest wywoływana dla każdego elementu. Musisz utworzyć własną pionową listę przewijania za pomocą scrollview –

+0

@ A.Anderson wydaje się, że wystąpił we wszystkich wersjach Androida. Testowałem na Android 2.3, 4.4 i 5.0 – R4j

Odpowiedz

4

Jeśli zastanawiasz się w jaki sposób Facebook zrobił, oni faktycznie wydali bibliotekę obraz ładowania (https://github.com/facebook/fresco)

Czy to możliwe, że faktycznie dzwoni notifyDataSetChanged na bazowym ListView w tym czasie? Również używasz hasStableIds()?

Dla UIL można spróbować użyć WeakMemoryCache (patrz: https://github.com/nostra13/Android-Universal-Image-Loader/wiki/Useful-Info), ponieważ teoretycznie pozwoli ci na użycie całej dostępnej pamięci, ale może spowodować wiele dodatkowych wywołań GC.

Dla metody Picassa Taha wygląda jak najlepiej!

1

Może twój rozmiar pamięci podręcznej jest mały i Picasso próbuje załadować obrazy z pamięci podręcznej dysku. Proszę sprawdzić here, aby określić rozmiar pamięci podręcznej. Możesz spróbować zwiększyć rozmiar pamięci podręcznej Picassa przez:

Picasso p = new Picasso.Builder(context) 
.memoryCache(new LruCache(cacheSize)) 
.build(); 

Jednak moim zdaniem Twoja aplikacja wygląda na niekończącą się karmę. Co oznacza, że ​​pamięć podręczna pamięci będzie pełna w pewnym momencie i będziesz musiał użyć pamięci podręcznej dysku. Pobieranie danych z pamięci podręcznej dysku jest wolniejsze w porównaniu z pamięcią podręczną pamięci.

+0

Użyłem zarówno pamięci podręcznej dysku, jak i pamięci podręcznej z UIL, problem ten nadal występował (nie próbowałem już pamięci podręcznej dysku w Picasso, w rzeczywistości, nie wiem jak). Ale czy myślisz, że pamięć podręczna dysku będzie działać? – R4j

+0

Myślę, że potrzebujesz większej pamięci podręcznej pamięci, ale w końcu skończysz z pamięcią podręczną dysku, która doprowadzi do pewnych opóźnień. Zwiększenie rozmiaru pamięci podręcznej rozwiąże ten problem? Nie jestem pewny. Być może problem występuje, ponieważ nie powoduje złomowania elementów widoku listy. Chodzi o złomowanie poglądów. Podobnie jak w widoku recyklera. – Taha