2016-05-18 8 views
2

Die Picasso library erlaubt es, ein Bild leicht wie zu laden:Wie spezifiziert man mehrere Fallback-Bilder mit Picasso?

Picasso.with(context).load(url).into(imageview); 

Die API auch ein Fehlerbild zu spezifizieren. Aber was kann ich tun, wenn ich möchte, dass die Bibliothek zuerst drei oder vier verschiedene URLs ausprobiert, bevor Sie das Fehlerbild anzeigen und anzeigen? Idealerweise würden diese Bilder sequentiell ausprobiert werden und auf die nächste zurückgreifen, wenn die vorherige nicht geladen wurde.

Antwort

4

Nativ gibt es keine API für solche Funktionalität. Aber mit etwas clever codierten Picasso.Target können Sie solche Funktionalität leicht erreichen.

Ich füge hier einen schnellen Hack-ungeprüften Code hinzu, der Ihnen eine rugged Idee geben sollte, wonach Sie suchen sollten. Sie müssen testen und vielleicht Feinabstimmung, aber das sollte ziemlich OK sein.

private static final List<MultiFallBackTarget> TARGETS = new ArrayList<MultiFallBackTarget>(); 

public static class MultiFallBackTarget implements Picasso.Target { 

    private WeakReference<ImageView> weakImage; 
    private List<String> fallbacks; 

    public MultiFallBackTarget(ImageView image){ 
     weakImage = new WeakReference<>(image); 
     fallbacks = new ArrayList<String>(); 
     TARGETS.add(this); 
    } 

    public void addFallback(String fallbackUrl){ 
     fallbacks.add(fallbackUrl); 
    } 

    public void onBitmapLoaded(Bitmap bitmap, LoadedFrom from){ 

     removeSelf(); 

     ImageView image = weakImage.get(); 
     if(image == null) return; 

     image.setImageBitmap(bitmap); 
    } 
    public void onBitmapFailed(Drawable errorDrawable){ 
     ImageView image = weakImage.get(); 
     if(image == null) { 
      removeSelf(); 
      return; 
     } 

     if(fallbacks.size() > 0){ 
     String nextUrl = fallbacks.remove(0); 
     // here you call picasso again 
     Picasso.with(image.getContext()).load(nextUrl).into(this); 
     } else { 
     removeSelf(); 
     } 
    } 
    public void onPrepareLoad(Drawable placeHolderDrawable){} 

    private void removeSelf(){ 
     TARGETS.remove(this); 
    } 
} 

Denken Sie daran, dass Picasso nicht halten starke Hinweise auf das Ziel, das Sie innerhalb into(object) setzen. Das heißt, intern verwendet Picasso WeakReference dazu.

Das bedeutet, dass Sie diese Selbstreferenz in TARGETS benötigen, um die Referenz aller MultiFallBackTarget zu behalten, die Sie erstellen und ihnen erlauben, sich selbst zu entfernen, wenn ihre Arbeit erledigt ist.

Verwandte Themen