2014-09-26 9 views
46

Ciao Voglio avere una barra di avanzamento per l'immagine che verrà mostrata durante il caricamento dell'immagine ma quando il caricamento dell'immagine sarà completato Voglio impostarlo su andato. In precedenza stavo usando la libreria Picasso per questo. Ma non so come usarlo con la libreria Glide. Ho idea che ci sia qualche funzione pronta per le risorse, ma non so come usarla. Qualcuno può aiutarmi?Imposta la visibilità della barra di avanzamento completata al completamento del caricamento dell'immagine utilizzando la libreria Glide

Codice in materia di Picasso Biblioteca

Picasso.with(mcontext).load(imgLinkArray.get(position).mUrlLink) 
     .into(imageView, new Callback() { 
      @Override 
      public void onSuccess() { 
       progressBar.setVisibility(View.GONE); 
      } 

      @Override 
      public void onError() { 
      } 
     }) 
; 

ora Come posso fare questo con Glide?

Glide.with(mcontext).load(imgLinkArray.get(position).mUrlLink) 
    .into(imageView); 

Sono in grado di caricare l'immagine da questo con Glide ma come posso scrivere progressBar.setVisibility(View.GONE); da qualche parte nel codice, se ottenere l'immagine caricata?

+2

Perché hai cambiato la vostra libreria? Picasso è fantastico. – tasomaniac

+0

Vorrei anche raccomandare di attenersi a Picasso a meno che non vi siano buoni motivi per cambiare le librerie – Chris

risposta

138

domanda è piuttosto vecchio, e non so quale fosse la situazione con glide in quei tempi, ma ora può essere fatto facilmente con chi ascolta (non come proposto nella risposta scelta come corretta).

progressBar.setVisibility(View.VISIBLE); 
Glide.with(getActivity()) 
    .load(args.getString(IMAGE_TO_SHOW)) 
    .listener(new RequestListener<String, GlideDrawable>() { 
     @Override 
     public boolean onException(Exception e, String model, Target<GlideDrawable> target, boolean isFirstResource) { 
      return false; 
     } 

     @Override 
     public boolean onResourceReady(GlideDrawable resource, String model, Target<GlideDrawable> target, boolean isFromMemoryCache, boolean isFirstResource) { 
      progressBar.setVisibility(View.GONE); 
      return false; 
     } 
    }) 
    .into(imageFrame) 
; 

Si restituiscono vero se vogliono gestire le cose come le animazioni te stesso e falsi se vuole scivolare per gestirli per voi.

+0

questo è meglio della risposta accettata – Frank

+11

Considera anche di nascondere 'progressBar' in' onException', altrimenti girerà indefinitamente dando false speranze. Una volta chiamato 'onException' Glide non farà altro che impostare cosa viene passato a' .error() '. – TWiStErRob

+1

Ciò può comportare NullPointerException se si lascia il Frammento/Attività prima che l'immagine venga caricata. – aProperFox

17

La mia risposta era basata su API obsolete. Vedi here per la risposta più aggiornata.

+0

'.listener() 'è migliore perché riceverai più informazioni sul tuo carico (modello, cache di memoria, ...) quindi è più facile decidere più logica personalizzata. 'RequestListener' è anche più stabile, ignorando quale' Target' creare non ti darà il beneficio di correzioni future. È anche possibile creare facilmente un 'VisibilityListener ' che è possibile riutilizzare in diversi contesti. – TWiStErRob

3

La soluzione di cui sopra funziona piuttosto bene anche per me ma quando uso asBitmap() per scaricare l'immagine. Non funziona.

Abbiamo bisogno di utilizzare BitmapImageViewTarget

Glide.with(this) .load(imageURL) 
.asBitmap() 
.placeholder(R.drawable.bg) 
.into(new BitmapImageViewTarget(imageView) { 
      @Override 
      public void onResourceReady(Bitmap drawable, GlideAnimation anim) { 
       super.onResourceReady(drawable, anim); 
       progressBar.setVisibility(View.GONE); 
      } 
     }); 
+0

Vedere il mio commento: http://stackoverflow.com/questions/26054420/set-visibility-of-progress-bar-gone-on-completion-of-image-loading-using-glide-l#comment54315331_26066582. Questa risposta è una buona dimostrazione di ciò che ho detto lì. – TWiStErRob

6

In deroga messo una condizione per mostrare di nuovo il ProgressBar

Glide.with(context) 
    .load(image_url) 
    .listener(new RequestListener<String, GlideDrawable>() { 
     @Override 
     public boolean onException(Exception e, String model, Target<GlideDrawable> target, boolean isFirstResource) { 
      if(e instanceof UnknownHostException) 
       progressBar.setVisibility(View.VISIBLE); 
      return false; 
     } 

     @Override 
     public boolean onResourceReady(GlideDrawable resource, String model, Target<GlideDrawable> target, boolean isFromMemoryCache, boolean isFirstResource) { 
      progressBar.setVisibility(View.GONE); 
      return false; 
     } 
    }) 
    .into(imageView); 
-2

Questa è la risposta migliore in quanto non usa fare altre cose come impostazione di visibilità per ottenere il risultato desiderato.

Scaricare un gif di progressbar e chiamarlo progressbargif e inserirlo nella cartella drawable.

 Glide.with(ctx) 
      .load(url) 
      .thumbnail(Glide.with(ctx).load(R.drawable.progressbargif)) 
      .diskCacheStrategy(DiskCacheStrategy.SOURCE) 
      .error(R.drawable.image_unavailable) 
      .crossFade(200) 
      .into(iv); 

Una volta caricata l'immagine url, la miniatura scompare. La miniatura scompare immediatamente quando viene caricata l'immagine memorizzata nella cache.

+0

perché questa risposta è downvoted ? – suku

+3

Penso che sia stato perché non risponde alla domanda: OP ha già uno spinner di cui è felice. È anche contro le best practice di Android: l'utilizzo di GIF come spinner è quindi di 90 anni e aumenta significativamente la dimensione dell'APK; e mettere una GIF in 'disegnabile' è di per sé un male perché non è caricato dal framework, dovrebbe essere in' raw' o 'assets' nella migliore delle ipotesi. Non c'è niente di sbagliato nel cambiare la visibilità quando accadono eventi nella tua app, Android è progettato per questo. – TWiStErRob

+1

L'utente vedrà anche uno spazio vuoto mentre la decodifica GIF si verifica, è asincrona e non immediata. Stai anche 'RISULTATO'-memorizzando nella cache la barra di avanzamento, il che significa che ci vorrà un po 'per caricare. Le GIF dovrebbero essere 'SOURCE'-memorizzate nella cache al meglio per l'efficienza; ma poiché questo è un file locale, la cache deve essere "NONE" per non duplicarla su disco, consumando ancora più spazio utente. – TWiStErRob

1
  1. In xml prendere barra di avanzamento con altezza & larghezza (match_parent).
  2. Prima di chiamare sotto il metodo di menzione, impostare la visibilità della barra di avanzamento Visibile.

    public void setImageWIthProgressBar(Context context, final ImageView imageView, String imageUrl, final ProgressBar progressBar) { 
    
         Glide.with(context) 
           .load(imageUrl) 
           .listener(new RequestListener<String, GlideDrawable>() { 
            @Override 
            public boolean onException(Exception e, String model, Target<GlideDrawable> target, boolean isFirstResource) { 
             progressBar.setVisibility(View.GONE); 
             return false; 
            } 
    
            @Override 
            public boolean onResourceReady(GlideDrawable resource, String model, Target<GlideDrawable> target, boolean isFromMemoryCache, boolean isFirstResource) { 
             progressBar.setVisibility(View.GONE); 
             return false; 
            } 
           }) 
           .into(imageView); 
    
        }//setImageWIthProgressBar 
    
+0

La tua risposta è diversa da https://stackoverflow.com/a/31675796/3812404? Inoltre, il punto 1 non è necessario. – HariRam

4

Se si vuole fare questo in Kotlin, si può provare in questo modo:

Glide.with(context) 
      .load(url) 
      .listener(object : RequestListener<Drawable> { 
       override fun onLoadFailed(p0: GlideException?, p1: Any?, p2: Target<Drawable>?, p3: Boolean): Boolean { 
        TODO("not implemented") //To change body of created functions use File | Settings | File Templates. 
       } 
       override fun onResourceReady(p0: Drawable?, p1: Any?, p2: Target<Drawable>?, p3: DataSource?, p4: Boolean): Boolean { 
        Log.d(TAG, "OnResourceReady") 
        //do something when picture already loaded 
        return false 
       } 
      }) 
      .into(imgView) 
+0

La versione di Kotlin funziona come un fascino – mrroboaat

Problemi correlati