Як слухати, як Пікассо (Android) завантажує повні події?


90

Чи є спосіб прослухати події від Пікассо при використанні конструктора, наприклад:

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

Я намагаюся подзвонити requestLayout()і invalidate()на батьках , GridViewтак що буде правильно змінити розмір , але я не знаю , як встановити слухач або зворотний виклик.

Я бачу, що у Пікассо є повідомлення про помилки, але чи є подія успіху?

Відповіді:


270

Ви можете використовувати 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? Мені потрібно оновити деякі змінні в контексті 'this', а також як я можу отримати доступ до imageView всередині зворотного виклику? Thx
сонолюмінесценція

2
Спробуйте це YourClassName.this.yourVariable @sonoluminescence
Sofiane Hassaini

1
Як би це виглядало в Котліні?
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?
Нур Хоссен

@NoorHossain встановив растрове зображення, коли растрове зображення завантажено
famfamfam

6

Відповідаючи на @Jas follow question як коментар до відповіді 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);
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.