2015-02-02 2 views
1

У меня возникли проблемы с загрузкой изображений в ListView с сервера Picasso.Проблема с базовым адаптером и пикассо

У меня есть BaseAdapter, который используется для заполнения моего ListView. В этом ListView некоторые элементы имеют изображение, а некоторые нет.

в этом методе:

public View getView(final int position, View convertView, ViewGroup parent) { 

я:

... 

//context = Activity context; 
//context1 = Context context1; 
context1 = context.getApplicationContext(); 

if (!photo[position].equals("")) { 

    String stringurl = "http://www.blablabla.it/img/"+photo[position]+".jpg"; 

    Picasso.with(context1) 
      .load(stringurl) 
      .placeholder(R.drawable.white) 
      .into(holder.imageD); 
     } 
else { 

    holder.imageD.setImageBitmap(null); 
} 

Этот код работает, но слишком часто я вижу, что изображение находится в другом месте, чем где она принадлежит!

, как вы можете себе представить, что это очень раздражает пользователей .. Спасибо всем

+1

Вы должны также использовать вызов Пикассо в другом статусе ... тогда любой запрос на загрузку для 'holder.imageD' должен быть отменен ... – Selvin

+0

@Selvin поэтому я должен написать: holder.imageD.setImageBitmap (null); if (...) {Picasso ...}? не могли бы вы привести мне пример? – Ilario

+0

'еще {Picasso.with (context1) .load (нуль) .placeholder (R.drawable.white) .into (holder.imageD);}' – Selvin

ответ

2

Вы столкнулись с этой проблемой becuase элементов ListView рецикла Просмотр + Picasso вызовы являются асинхронными ... Как это может появится?

  1. Вы начать загрузки с Пикассо
  2. Посмотреть повторно используются (convertView! = NULL)
  3. Вы настраиваете holder.imageD.setImageBitmap(null);
  4. асинхронных от точки 1. является finnished

Вот почему у вас неправильный образ загружен ...

Чтобы избежать вам необходимо сообщить об этом загрузчику Picasso, чтобы отменить предыдущий запрос. Так вместо того, чтобы просто установка растрового изображения обнулить вы должны установить его с помощью библиотеки Пикассо (в еще Постулаты использования):

Picasso.with(context1).load(null).placeholder(R.drawable.white).into(holder.imageD);

редактировать: следующие @Budius комментарии: даже лучшее решение будет отменить и установить вместо этого:

{ 
    Picasso.with(context1).cancelRequest(holder.imageD); 
    //holder.imageD.setImageBitmap(null); //or 
    holder.imageD.setImageResource(R.drawable.white); //depends on your needs 
} 

Это должно быть более эффективным способом, поскольку он должен создавать меньше внутренних объектов при каждом вызове getView.

+0

спасибо человеку :))) – Ilario

+0

Я считаю, что лучше практиковать вручную задавать нуль на вашем изображении и просто информировать Пикассо, чтобы отменить запрос 'Picasso.with (c) .cancelRequest (holder.imageD); holder.imageD.setImageBitmap (null); 'Ваш путь, кажется, создает новый запрос без уважительной причины. – Budius

+0

@Budius ... что вы подразумеваете под «новым запросом»? (Запрос объекта из библиотеки piccasso или какого-либо сетевого запроса?) на самом деле это будет почти тот же код, что и в «в»: 'if (! data.hasImage()) { picasso.cancelRequest (target); target.onPrepareLoad (setPlaceholder? GetPlaceholderDrawable(): null); возвращение; } 'и если uri имеет значение null, то hasImage возвращает false ... поэтому не будет использоваться работа в сети (если это факт, это будет вызов syncrounus) ... также с моей версией вместо этого будет использоваться заполнитель нулевой битмап – Selvin