Comment écouter les événements complets de chargement de Picasso (Android)?

90

Existe-t-il un moyen d'écouter les événements de Picasso lors de l'utilisation du générateur comme:

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

J'essaie d'appeler requestLayout()et invalidate()sur le parent GridViewpour qu'il se redimensionnera correctement mais je ne sais pas comment définir un auditeur ou un rappel.

Je vois que Picasso a des rapports d'événements d'erreur, mais y a-t-il un événement de réussite?

Keith
la source

Réponses:

270

Vous pouvez utiliser a Callbackpour obtenir les événements onSuccess et onError. Ajoutez simplement un nouveau rappel à votre demande comme ceci:

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

                        }

                        @Override
                        public void onError() {

                        }
                    });

Ensuite, vous pouvez effectuer toutes les altérations et modifications dans le rappel onSuccess.

MrEngineer13
la source
1
Comment afficher l'image d'erreur lorsque onError () est exécuté?
Jas
2
Utilisez .error(R.drawable.error_placeholder_image)pour définir l'image d'erreur
Raptor
Comment puis-je accéder au contexte «this» depuis onSuccess? J'ai besoin de mettre à jour certaines variables dans le contexte «this», et comment puis-je accéder à l'imageView dans le rappel? Thx
sonoluminescence
2
Essayez ceci YourClassName.this.yourVariable @sonoluminescence
Sofiane Hassaini
1
À quoi cela ressemblerait-il à Kotlin?
Dan2899
31

Si vous devez accéder au bitmap avant qu'il ne soit chargé dans la vue, essayez d'utiliser:

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

Dans la méthode d'appel:

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

Idéalement, vous implémenteriez Target sur une vue ou un objet de titulaire de vue directement.

J'espère que cela t'aides

Androidme
la source
où est l'imgView?
Noor Hossain
@NoorHossain définit le bitmap de l'image lorsque le bitmap est chargé
famfamfam
6

En répondant à la question de suivi de @Jas en tant que commentaire à la réponse de MrEngineer13 (puisque je n'ai pas assez de réputation pour commenter une réponse), vous devez utiliser la error()méthode avant d'enregistrer Callbackla into()méthode at , par exemple:

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
        }
    }
);
Guilherme Santos
la source
6

Square a récemment mis à jour la classe Target et il existe maintenant plus de méthodes à remplacer ( onPrepareLoadet 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) {

    }
};

Et vous devez toujours utiliser:

Picasso.with(context).load(url).into(target);
Mateusz Pryczkowski
la source
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);
vaibhav jain
la source
0

Essaye ça

       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);
                }
            });
AGTHAMAIS
la source
0

En complément d'autres réponses, au cas où vous ne sauriez pas où utiliser la vue originale de l'image, par exemple ImageView myIV:

Original:

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

Nouveau (à l'intérieur onBitmapLoaded()de new Target()):

public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) {
    myIV.setImageBitmap(bitmap);
}
Fruit
la source