Изображения Пикассо не загружаются в GridView

У меня проблемы с Picasso, у меня есть пользовательский адаптер, загружающий изображения следующим образом:

Picasso.with (this.ctx) .load (contact.getPhotoURI ()). Placeholder (R.drawable.contact_no_picture) .into (img);

Это загружается в ImageView, который помещается внутри GridView.

Результат следующий:

введите описание изображения здесь

Как видите, изображения загружены наполовину, а в некоторых случаях вообще не загружены.

Я что-то упускаю?


person JamieB    schedule 15.05.2014    source источник
comment
Из скриншота не ясно, каковы ваши ожидания, похоже, отображаются только заполнители. Какие-нибудь из ваших иконок вообще загружаются в сетку?   -  person rekaszeru    schedule 16.05.2014


Ответы (1)


При использовании Picasso с рендерерами элементов в списке / сетке я в конечном итоге использовал интерфейс ListeningTarget, который предоставляет библиотека:

Создайте собственный класс, который расширяет ImageView и реализует ListeningTarget.

public class PicassoImageView extends ImageView implements ListeningTarget
{...}

В переопределенном onBitmapLoaded вызове метода this.setImageBitmap(bmp);, где bmp - это параметр, который Пикассо передает как растровое изображение загруженного изображения:

@Override
public void onBitmapLoaded(Bitmap bmp, LoadedFrom loadedFrom)
{
    Log.d("Picasso", "Image loaded");
    this.setImageBitmap(bmp);
}

Используйте этот класс для экземпляра img в вашем макете.

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" ...>

    [...]
    <com.your.packagename.PicassoImageView
        android:id="@+id/renderer_icon"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" ... />
    [...]
</RelativeLayout>

И инициализируйте его так:

PicassoImageView img = (PicassoImageView) findViewById(R.id.renderer_icon);

Измените свой призыв к Пикассо, чтобы:

Picasso.with(this.ctx).load(contact.getPhotoURI())
    .placeholder(R.drawable.contact_no_picture)
    .into((ListeningTarget)img);

Конечно, не обязательно, чтобы ImageView реализовывал ListeningTarget, но я обнаружил, что это проще, чем искать нужное представление каждый раз, когда Пикассо загружает растровое изображение.

person rekaszeru    schedule 15.05.2014
comment
Я уже использовал настраиваемый просмотр изображений, использование стандартного просмотра изображений, похоже, решает проблему. - person JamieB; 16.05.2014
comment
Да, это странная обратная сторона Пикассо. Но таким образом вы все равно можете воспользоваться преимуществами расширения вашего собственного класса. - person rekaszeru; 16.05.2014