Come ascoltare Picasso (Android) caricare eventi completi?


90

C'è un modo per ascoltare gli eventi di Picasso quando si utilizza il builder come:

Picasso.with(getContext()).load(url).into(imageView);

Sto cercando di chiamare requestLayout()e invalidate()sul genitore in GridViewmodo che venga ridimensionato correttamente ma non so come impostare un ascoltatore o una richiamata.

Vedo che Picasso ha la segnalazione di eventi di errore, ma c'è un evento di successo?

Risposte:


270

È possibile utilizzare a Callbackper ottenere eventi onSuccess e onError. Basta aggiungere una nuova richiamata alla tua richiesta in questo modo:

Picasso.with(getContext())
    .load(url)
    .into(imageView, new com.squareup.picasso.Callback() {
                        @Override
                        public void onSuccess() {

                        }

                        @Override
                        public void onError() {

                        }
                    });

Quindi è possibile eseguire qualsiasi alterazione e modifica nella richiamata onSuccess.


1
Come mostrare l'immagine di errore quando viene eseguito onError () ??
Jas

2
Utilizzare .error(R.drawable.error_placeholder_image)per impostare l'immagine di errore
Raptor

Come posso accedere a "questo" contesto da onSuccess? Ho bisogno di aggiornare alcune variabili nel contesto "this" e anche come posso accedere a imageView all'interno del callback? Grazie
sonoluminescenza

2
Prova questo YourClassName.this.yourVariable @sonoluminescence
Sofiane Hassaini

1
Come sarebbe questo a Kotlin?
Dan2899

31

Se è necessario accedere alla bitmap prima che venga caricata nella vista, provare a utilizzare:

private Target target = new Target() {
      @Override
      public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) {       
      }
      @Override
      public void onBitmapFailed() {
      }
}

Nel metodo di chiamata:

Picasso.with(this).load("url").into(target);

Idealmente dovresti implementare Target su una vista o direttamente sull'oggetto titolare della vista.

Spero che questo ti aiuti


dov'è imgView?
Noor Hossain

@NoorHossain imposta la bitmap dell'immagine quando viene caricata la bitmap
famfamfam

6

Rispondendo alla domanda di follow-up di @Jas come commento alla risposta di MrEngineer13 (dato che non ho abbastanza reputazione per commentare in nessuna risposta), dovresti usare il error()metodo prima di registrare Callbackil into()metodo at , ad esempio:

Picasso.with(getContext())
    .load(url)
    .error(R.drawable.error_placeholder_image)
    .into(imageView, new com.squareup.picasso.Callback() {
        @Override
        public void onSuccess() {
            //Success image already loaded into the view
        }

        @Override
        public void onError() {
            //Error placeholder image already loaded into the view, do further handling of this situation here
        }
    }
);

6

Square ha recentemente aggiornato la classe Target e ora ci sono più metodi per sovrascrivere ( onPrepareLoade onBitmapFailed):

Target target = new Target() {
    @Override
    public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) {
    }

    @Override
    public void onBitmapFailed(Drawable errorDrawable) {

    }

    @Override
    public void onPrepareLoad(Drawable placeHolderDrawable) {

    }
};

E devi ancora usare:

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

3
 private final Callback mImageCallback = new Callback() {
        @Override
        public void onSuccess() {
            startPostponedEnterTransition();
        }

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

RequestCreator creator = Picasso.with(getActivity()).load(list.get(position).getId());
creator.into(imageView, mImageCallback);

0

Prova questo

       Picasso.with(context)
            .load(services.get(position).getImageInactive())
            .into(holder.icon, new Callback() {
                @Override
                public void onSuccess() {
                    holder.imageLoad.setVisibility(View.GONE);
                }

                @Override
                public void onError() {
                    holder.icon.setImageResource(R.drawable.ic_error_image_load);
                }
            });

0

Come complemento ad altre risposte, nel caso in cui non sai dove utilizzare la visualizzazione dell'immagine originale, ad esempio ImageView myIV:

Originale:

Picasso.with(activity).load(url).into(myIV);

Nuovo (all'interno onBitmapLoaded()di new Target()):

public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) {
    myIV.setImageBitmap(bitmap);
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.