Использование цели в Picasso на адаптере

У меня большие проблемы с использованием цели внутри адаптера. Я смущен о документации по коду

Объекты, реализующие этот класс, должны иметь рабочую реализацию {@link #equals (Object)} и {@link #hashCode ()} для правильного хранения внутри. Экземпляры этого интерфейса также будут сравниваться, чтобы определить, происходит ли переработка вида. Рекомендуется добавить этот интерфейс непосредственно к настраиваемому типу вида при использовании в адаптере для обеспечения правильного поведения в отношении рециркуляции.

Я пытаюсь использовать цель таким образом:

class CustomTarget implements Target { private ImageView imageView; public CustomTarget(ImageView imageView) { this.imageView = imageView; } @Override public void onBitmapLoaded(final Bitmap bitmap, Picasso.LoadedFrom from) { imageView.setImageDrawable(new RoundedAvatarDrawable(bitmap)); } @Override public void onBitmapFailed(Drawable errorDrawable) { imageView.setImageDrawable(errorDrawable); } @Override public void onPrepareLoad(Drawable placeHolderDrawable) { imageView.setImageDrawable(placeHolderDrawable); } @Override public boolean equals(Object o) { return imageView.equals(o); } @Override public int hashCode() { return imageView.hashCode(); } } @Override public View getView(int position, View v, ViewGroup parent) { .... RoundedAvatarDrawable r = new RoundedAvatarDrawable(BitmapFactory.decodeResource(mContext.getResources(), R.drawable.ic_avatar_seahorse)); ImageCacheController.with(mContext).getPicasso().load(member.getPicture_url()).resize(100, 100).centerCrop().placeholder(r).error(r).into(new CustomTarget(viewHolder.ivAvatar)); .... } 

Это не работает, и изображения изменяются между собой случайно

Вы не показываете всю getView функцию getView , поэтому, не зная, как вы используете viewHandler, вот мой взгляд на то, что происходит:

Ваша проблема в том, что вы создаете новый CustomTarget каждом getView . Вы идете против объекта Target . Позвольте мне уточнить.

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

Вы используете новый объект для каждого запроса, эффективно намекая Picasso, что каждый запрос для другой строки, так сказать. Док говорит: « Экземпляры этого интерфейса также будут сравниваться, чтобы определить, происходит ли переработка вида », поэтому, поскольку каждый запрос имеет только что созданный объект CustomTarget , ни один из двух запросов не будет иметь один и тот же объект, и повторная обработка строки не будет обнаружена.

Вы также используете viewHolder. В этом случае я думаю, что viewHolder должен расширять интерфейс Target (если у вас только 1 изображение на строку). Таким образом, каждый раз, когда вы запрашиваете загрузку, вы можете использовать один и тот же объект, а не создавать новый.

Вы также делегируете реализацию своего CustomTarget в реализацию ImageView . Убедитесь, что функции ImageView equals и hashCode соответствуют требованиям, которые требует Picasso.

Некоторая информация о том, как реализовать equals и hashCode : Какие проблемы следует учитывать при переопределении equals и hashCode в Java?

Кажется, ваш метод равенства нарушен. Вы сравниваете изображение с пользовательской целью. Это может исправить:

 public boolean equals(Object o) { if(o instanceof CustomTarget) { return ((CustomTarget) o).imageView.equals(this.imageView); } return super.equals(o); } 
Intereting Posts
Каждый модуль должен иметь уникальный путь Если вызов onComplete сделан для темы RxJava, мне нужно снова отменить подписку? Как получить высоту кнопки, чтобы соответствовать высоте другого элемента? Как показать диалог прогресса в Android? Предупреждение о градиенте печатает, но SuppressWarnings установлен Выключайте экран программно, когда лицо закрывает экран на Android Могу ли я объединить несколько файлов хранилища ключей Android в один? OOD и Передача активности в качестве параметра для конструкторов других классов Ваш Android SDK отсутствует, устарел или отсутствует шаблоны Установить видимость не работает imageview Android – Ошибка – IllegalArgumentException: тип окна не может быть изменен после добавления окна Перетаскивание RecyclerView, которое заполняется из SQLiteDatabase Уровень сигнала эмулятора Android Ошибка с настройкой живых обоев Строки списка Android ListView в ScrollView не отображаются полностью – обрезаны