2013-11-25 2 views
9

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

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

Im пытается использовать объект таким образом:

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)); 
.... 
} 

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

+0

Похоже, что ваш 'getView()' сломан. Отправьте свой метод 'getView()' здесь. Если вам нужно, почему бы не попросить Eclipse генерировать 'equals()' и 'hashCode()' метод для вас. ** Щелкните правой кнопкой мыши> Источник> Генерировать 'hashCode()' и 'equals()' ... ** –

+0

И BTW Picasso также принимает 'ImageView', поэтому вам не нужно писать этот класс-оболочку. Просто отправьте 'ImageView' в' in() 'метод. –

+0

Я использую Target, потому что мне нужна вытачиваемая оболочка с именем «RoundedAvatarDrawable» -> imageView.setImageDrawable (новый RoundedAvatarDrawable (bitmap)); , То есть для круга изображение как круг. –

ответ

11

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

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

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

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

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

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

Некоторая информация о том, как реализовать equals и hashCode: What issues should be considered when overriding equals and hashCode in Java?

+0

Реализации «ImageView» будут в порядке. –

+0

@ Jake Является ли повторная проверка также с этими двумя функциями? Если это так, то я думаю, что проблема является проблемой. не из-за его использования равных и hashCode, и мой ответ в основном неактуальен. Или проверка, ищущая тот же самый точный объект (используя ==)? – frozenkoi

+0

Используется 'WeakHashMap', который будет использовать оба метода для bucketing, а затем равенство. –

0

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

public boolean equals(Object o) { 
    if(o instanceof CustomTarget) { 
     return ((CustomTarget) o).imageView.equals(this.imageView); 
    } 
    return super.equals(o); 
} 
Смежные вопросы