2013-06-05 14 views
5

Używam ArrayAdapter do ustawiania danych w ListView z nieskończoną funkcją przewijania. There's ImageView i dwa TextViews w wierszu ListView. Na początku ładuję ListView z 10 elementami i przewijając w dół, wywołuję usługę sieciową w setonscrolllistener, aby załadować kolejne 10 elementów do ListView. Po dodaniu nowych elementów do listy należy po prostu zadzwonić pod numer adapter.notifysetdatachanged, aby przekazać adapterowi możliwość odświeżenia ListView.ListView migotanie po dodaniu nowych elementów

Problem polega na tym, że za każdym razem, gdy nowe pozycje zostaną dodane do ListView, cały ListView odświeża się i powoduje migotanie obrazów z już załadowanego ListView. Tak, buforuję wszystkie obrazy na dysku i pamięci, a kod wykonuje cache bardzo płynnie.

Próbowałem też dodawanie danych do karty za pomocą tego adapter.addall(myarraylist) ale to nie pomogło. ImageViews nadal migocze. Dużo o tym przeszukałem na StackOverflow i odkryłem, że nie możesz dodawać i pokazywać więcej elementów w ListView bez odświeżania całego listView. Już to wiem, ale musi istnieć jakiś sposób dodawania nowych danych do ListView i nieodświeżania już załadowanych danych.

Konfiguruję adapter w ten sposób.

public View getView(int position, View view, ViewGroup parent) 
     { 

     int main = R.layout.layout; 
     ViewHolder holder = null; 
     LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     if (view == null) { 

      holder = new ViewHolder(); 
      view = inflater.inflate(main, null); 
      holder.image = (ImageView) convertView.findViewById(R.id.imageview); 

      ///More stuff 

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

     // Loading ImageViews by Urls 

     return view; 
    } 

Czy ktoś mógłby rzucić trochę światła na to?

+0

Nie do końca pewny, ale może być powiązany. http://stackoverflow.com/questions/13322575/android-visible-listview-images-flicker-when-adding-data-to-arrayadapter – Zerkz

+0

spróbować tej https://github.com/commonsguy/cwac-endless –

+0

Można pokazać, jak ładujesz obrazy do widoku? Pozdrowienia – asheinfeld

Odpowiedz

2

Wydaje się, że robisz to we właściwy sposób, więc może być problem z imageLoader. Nie powinien ustawiać obrazu ponownie w widoku obrazu, jeśli adres URL jest taki sam.

np. Możesz użyć metody setTag (url) na obrazie i sprawdzić, czy adres URL się zmienił.

Mam nadzieję, że to ci pomoże.

+2

Wygląda na to, że to problem z Universal Image Loader. Spróbuję użyć innej biblioteki i powiedzieć, czy problem nadal występuje. Dziękuję za odpowiedź. –

+1

W moim przypadku był to problem z programem ładującym obrazy. Gdy tylko zacząłem sprawdzać, czy kod będzie pobierał ten sam obraz, efekt migotania zniknął. – Bobrovsky

1

Rozwiązaniem jest nie przeładować obraz, gdy nie uległ zmianie.

W swoich adapterów getView() zrobić:

// schedule rendering: 
final String path = ... (set path here); 
if (holder.lastImageUrl == null || !holder.lastImageUrl.equals(path) 
       || holder.headerImageView.getDrawable() == null) { 
    // refresh image 
    imageLoader.displayImage(imageUri, imageAware); 
} else { 
    // do nothing, image did not change and does not need to be updated 
} 

na sukces (dodaj ImageLoadingListener) ustawić holder.lastImageUrl = ścieżka, na uda i anulować ustawienie holder.lastImageUrl null tak, że będzie przeładować następnym razem.

Powiązane problemy