2015-05-14 2 views
8

neu zu laden Ich erstellte eine App zum Laden von Bildern aus dem Internet in Karten. Ich benutze Recyclerview zum Auflisten von Zwecken. Zum Herunterladen von Bildern habe ich Picasso, Universal-Image-Downloader und andere benutzerdefinierte Methoden ausprobiert, aber überall habe ich dieses Problem:Android - Wie Bilder in Recyclerview beim Scrollen

Immer wenn ich nach unten und oben scrollen, werden die Bilder in Imageview neu geladen. Ich habe sogar eine Bedingung behalten, um zu überprüfen, ob die Bildansicht ein Bild enthält, aber das scheint auch nicht zu funktionieren oder mein Code ist möglicherweise fehlerhaft. Aber ich kann keine Lösung für dieses Problem finden. Unten habe ich die Funktion 'onBindViewHolder' meines Codes angehängt, die ich für den problematischen Teil halte. Hier sind Bilder eine String-Arraylist, die Bild-URLs enthält.

public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {    
     View view = LayoutInflater.from(parent.getContext()) 
       .inflate(R.layout.default_card, parent, false); 

     ViewHolder viewHolder; 
     viewHolder = new ViewHolder(view); 

     return viewHolder; 
    } 

    @Override 
    public void onBindViewHolder(ViewHolder holder, int position) {    
     String url = images.get(position); 

     if (holder.imgView.getDrawable() != null) { 
      //Do Nothing 
     } else {     
      ImageLoader.getInstance().displayImage(url, holder.imgView);    
     } 
    } 
+1

"Immer wenn ich nach unten scrolle und die Bilder in Bildansicht werden neu geladen" - was bedeutet das? "oder mein Code kann fehlerhaft sein" - ja, es ist fehlerhaft. Es bindet ein neues Bild an diese ImageView, wenn der ViewHolder wiederverwendet wird. – CommonsWare

Antwort

1

Zunächst gibt es einen Fehler im Code - Sie können den Zustand von onBindViewHolder zu entfernen haben. Alle ImageView Instanzen müssen jedes Mal aktualisiert werden, wenn sie angezeigt werden sollen.

@Override 
public void onBindViewHolder(ViewHolder holder, int position) {    
    String url = images.get(position);    
    ImageLoader.getInstance().displayImage(url, holder.imgView);    
} 

Das Nachladen Teil:

Das Problem ist, dass Sie wahrscheinlich jede Cache nicht verwenden (In-Memory oder Disk-basierten). Ich würde nicht viel darüber sprechen, das Zwischenspeichern von Bildern in Sammlungsansichten ist ein wirklich häufiges Problem und ich bin sicher, dass eine schnelle StackOverflow-Suche Ihnen viele Ergebnisse liefern wird.

Ganz besonders - Universalbild does not have caching enabled by default Sie können es auf diese Weise schalten.

DisplayImageOptions options = new DisplayImageOptions.Builder() 
    ... 
    .cacheInMemory(true) 
    .cacheOnDisk(true) 
    ... 
    .build(); 
ImageLoader.getInstance().displayImage(imageUrl, imageView, options); // Incoming options will be used 

Oder Sie können es global für Ihre Anwendung einstellen, überprüfen Sie einfach die Dokumente.

+0

Ich habe die Optionen cacheInMemory und cacheInDisk bereits festgelegt. Ich weiß nicht, warum es vorher nicht funktioniert hat, aber das Entfernen der Bedingung hat den Trick gemacht, aber trotzdem kann ich sehen, wenn ich runterscrolle, ändern sich einige neue Bilder, aber nur ein paar. – RattusRattus

0

Wenn Sie keinen Cache verwenden möchten, können Sie setItemViewCacheSize (Größe) verwenden und die Größe angeben, die nicht neu geladen werden soll. Das ist es. Recyclerview Version 24.0.0

0

Sie können .fit() mit Picasso verwenden. Hoffe, dass Ihr Problem löst

Picasso.with(persons.get(i).context) 
    .load(persons.get(i).photoId) 
    .placeholder(R.drawable.placeholder) 
    .fit() 
    .into(personPhoto);