วิธีฟัง Picasso (Android) โหลดเหตุการณ์ที่สมบูรณ์?


92

มีวิธีฟังเหตุการณ์จาก Picasso ไหมเมื่อใช้ตัวสร้างเช่น:

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

ฉันพยายามที่จะเรียกrequestLayout()และinvalidate()ในผู้ปกครองGridViewดังนั้นจึงจะปรับขนาดได้อย่างถูกต้อง แต่ผมไม่ทราบวิธีการตั้งค่าฟังหรือโทรกลับ

ฉันเห็นว่า Picasso มีการรายงานเหตุการณ์ผิดพลาด แต่มีเหตุการณ์สำเร็จหรือไม่

คำตอบ:


272

คุณสามารถใช้ a Callbackเพื่อรับเหตุการณ์ onSuccess และ onError เพียงเพิ่มการโทรกลับใหม่ในคำขอของคุณดังนี้:

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

                        }

                        @Override
                        public void onError() {

                        }
                    });

จากนั้นคุณสามารถดำเนินการแก้ไขและแก้ไขใด ๆ ในการเรียกกลับ onSuccess


1
วิธีแสดงภาพข้อผิดพลาดเมื่อดำเนินการ onError () ??
Jas

2
ใช้.error(R.drawable.error_placeholder_image)เพื่อตั้งค่าภาพผิดพลาด
Raptor

ฉันจะเข้าถึงบริบท 'this' จากภายใน onSuccess ได้อย่างไร? ฉันต้องการอัปเดตตัวแปรบางตัวในบริบท "นี้" และฉันจะเข้าถึง imageView ภายในการเรียกกลับได้อย่างไร Thx
sonoluminescence

2
ลองใช้ YourClassName.this.yourVariable @sonoluminescence
Sofiane Hassaini

1
สิ่งนี้จะเป็นอย่างไรใน Kotlin?
Dan2899

31

หากคุณต้องการเข้าถึงบิตแมปก่อนที่จะโหลดไปยังมุมมองให้ลองใช้:

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

ในวิธีการโทร:

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

ตามหลักการแล้วคุณจะติดตั้ง Target ในมุมมองหรือมุมมองวัตถุโดยตรง

หวังว่านี่จะช่วยได้


imgView อยู่ที่ไหน
Noor Hossain

@NoorHossain ตั้งค่าบิตแมปภาพเมื่อโหลดบิตแมป
famfamfam

6

การตอบคำถามติดตามของ @Jas เป็นความคิดเห็นสำหรับคำตอบของ MrEngineer13 (เนื่องจากฉันไม่มีชื่อเสียงมากพอที่จะแสดงความคิดเห็นในคำตอบใด ๆ ) คุณควรใช้error()วิธีนี้ก่อนที่จะลงทะเบียนCallbackที่into()เมธอดตัวอย่างเช่น:

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 ได้อัปเดตคลาส Target เมื่อเร็ว ๆ นี้และตอนนี้มีวิธีการอื่น ๆ ในการแทนที่ ( onPrepareLoadและ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) {

    }
};

และคุณยังต้องใช้:

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

ลองสิ่งนี้

       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

เพื่อเป็นส่วนเสริมของคำตอบอื่น ๆ ในกรณีที่คุณไม่รู้ว่าจะใช้มุมมองภาพต้นฉบับที่ไหนเช่นImageView myIV:

ต้นฉบับ:

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

ใหม่ (ภายในonBitmapLoaded()ของnew Target()):

public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) {
    myIV.setImageBitmap(bitmap);
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.