2013-06-05 25 views
5

Sto utilizzando ArrayAdapter per impostare i dati in ListView con funzionalità di scorrimento infinito. C'è un ImageView e due TextViews in una riga di ListView. Inizialmente, sto caricando ListView con 10 elementi e, durante lo scorrimento verso il basso, chiamo il servizio web in setonscrolllistener per caricare i 10 elementi successivi a ListView. Quando vengono aggiunti nuovi elementi all'Arraylist, è sufficiente chiamare lo adapter.notifysetdatachanged per indicare all'adattatore di aggiornare ListView.ListView sfarfallio quando vengono aggiunti nuovi elementi

Ora il problema è che, ogni volta che i nuovi elementi vengono aggiunti a ListView, l'intero ListView si aggiorna e fa sì che le immagini nel ListView, che sono già caricate, sfarfallino. Sì, sto memorizzando nella cache tutte le immagini sia nel disco che nella memoria, e il codice fa il caching molto agevolmente.

Ho anche provato ad aggiungere dati nell'adattatore utilizzando questo adapter.addall(myarraylist) ma non è stato di aiuto. Le immagini sono ancora tremolanti. Ho cercato molto su StackOverflow e ho scoperto che non è possibile aggiungere e mostrare più elementi in ListView senza aggiornare l'intero listView. Lo so già, ma ci deve essere un modo per aggiungere nuovi dati a ListView e non per aggiornare i dati già caricati.

Sto configurando l'adattatore in questo modo.

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

Qualcuno potrebbe per favore far luce su di esso?

+0

Non esattamente sicuro, ma questo potrebbe essere correlato. http://stackoverflow.com/questions/13322575/android-visible-listview-images-flicker-when-adding-data-to-arrayadapter – Zerkz

+0

prova questo https://github.com/commonsguy/cwac-endless –

+0

Puoi mostra come stai caricando le immagini nella vista? Cheers – asheinfeld

risposta

2

Sembra che lo stiate facendo nel modo giusto, quindi il problema potrebbe essere causato dal vostro imageLoader. Non dovrebbe impostare di nuovo l'immagine sul tuo imageview se l'url è lo stesso.

ad es. Puoi utilizzare il metodo setTag (url) sul tuo imageView e testare se l'url è cambiato.

Spero che questo ti possa aiutare.

+2

Sembra che sia il problema con Universal Image Loader. Proverò a usare un'altra libreria e ti dirò se il problema persiste ancora. Grazie per la risposta. –

+1

Nel mio caso si trattava del problema del caricatore di immagini. Non appena ho iniziato a controllare se il codice sta per scaricare la stessa immagine, l'effetto sfarfallio è scomparso. – Bobrovsky

1

La soluzione è di non ricaricare l'immagine quando non è cambiata.

In adattatori GetView() DO:

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

in caso di successo (aggiungere un ImageLoadingListener) si imposta holder.lastImageUrl = percorso, sulla fallire e annullare si imposta holder.lastImageUrl su null in modo che ricaricherà la prossima volta.

Problemi correlati