Wie kann man auf Picasso (Android) warten, um vollständige Ereignisse zu laden?


89

Gibt es eine Möglichkeit, auf Ereignisse von Picasso zu warten, wenn Sie den Builder verwenden, wie:

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

Ich versuche anzurufen requestLayout()und invalidate()das übergeordnete GridViewElement anzurufen, damit die Größe ordnungsgemäß geändert wird, aber ich weiß nicht, wie ich einen Listener oder Rückruf festlegen soll.

Ich sehe, dass Picasso Fehlerereignisberichte hat, aber gibt es ein Erfolgsereignis?

Antworten:


269

Sie können a verwenden Callback, um Ereignisse onSuccess und onError abzurufen. Fügen Sie Ihrer Anfrage einfach einen neuen Rückruf hinzu:

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

                        }

                        @Override
                        public void onError() {

                        }
                    });

Anschließend können Sie im onSuccess-Rückruf alle Änderungen und Modifikationen vornehmen.


1
Wie wird ein Fehlerbild angezeigt, wenn onError () ausgeführt wird?
Jas

2
Verwenden Sie .error(R.drawable.error_placeholder_image), um Fehlerbild einzustellen
Raptor

Wie kann ich von onSuccess aus auf den Kontext 'this' zugreifen? Ich muss einige Variablen im 'this'-Kontext aktualisieren und wie kann ich auch auf die imageView innerhalb des Rückrufs zugreifen? Thx
Sonolumineszenz

2
Versuchen Sie dies YourClassName.this.yourVariable @sonoluminescence
Sofiane Hassaini

1
Wie würde das in Kotlin aussehen?
Dan2899

31

Wenn Sie auf die Bitmap zugreifen müssen, bevor sie in die Ansicht geladen wird, versuchen Sie Folgendes:

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

In der aufrufenden Methode:

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

Idealerweise implementieren Sie Target direkt in einer Ansicht oder einem Ansichtsinhaberobjekt.

Hoffe das hilft


wo ist das imgView?
Noor Hossain

6

Wenn Sie die Folgefrage @Jas als Kommentar zur Antwort von MrEngineer13 beantworten (da ich nicht genug Ruf habe, um eine Antwort zu kommentieren), sollten Sie die error()Methode verwenden, bevor Sie die Callbackat- into()Methode registrieren , zum Beispiel:

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 hat kürzlich die Zielklasse aktualisiert und jetzt gibt es mehr Methoden zum Überschreiben ( onPrepareLoadund 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) {

    }
};

Und Sie müssen noch verwenden:

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

Versuche dies

       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

Als Ergänzung zu anderen Antworten, falls Sie nicht wissen, wo Sie die Originalbildansicht verwenden sollen, z ImageView myIV.

Original:

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

Neu (innerhalb onBitmapLoaded()von new Target()):

public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) {
    myIV.setImageBitmap(bitmap);
}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.