Verwendung von Target in Picasso auf Adapter

Ich habe große Schwierigkeiten mit einem Target in einem Adapter. Ich habe die Dokumentation über den Code verwirrt

Objekte, die diese Klasse implementieren, müssen eine funktionierende Implementierung von {@link #equals (Object)} und {@link #hashCode ()} für die korrekte Speicherung intern haben. Instanzen dieser Schnittstelle werden auch verglichen, um festzustellen, ob View Recycling auftritt. Es empfiehlt sich, diese Schnittstelle direkt an einen benutzerdefinierten View-Typ anzupassen, wenn Sie einen Adapter verwenden, um ein korrektes Recycling-Verhalten zu gewährleisten.

Ich versuche, das Ziel so zu nutzen:

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

Es funktioniert nicht und die Bilder wechseln sich gegenseitig zufällig

  • Verwenden der Picasso-Bibliothek mit ListView
  • 2 Solutions collect form web for “Verwendung von Target in Picasso auf Adapter”

    Sie zeigen nicht Ihre ganze getView Funktion, also ohne zu wissen, wie Sie den ViewHandler verwenden, hier ist mein Nehmen auf, was los ist:

    Ihr Problem ist, dass Sie ein neues CustomTarget jedes Mal getView wenn getView aufgerufen wird. Du gehst gegen den Punkt, dass du ein Zielobjekt hast. Lassen Sie mich ausarbeiten.

    Wenn eine neue Download-Anforderung gemacht wird, werden vorherige Anfragen an das gleiche Ziel gestoppt oder führen nicht zu einem Aufruf der Rückrufe des Targets. (Also wenn das Ziel für eine andere Zeile in einer Liste wiederverwendet wird, bekommt man nicht beide Zeilenbilder).

    Sie verwenden ein neues Objekt für jede Anfrage, was effektiv auf Picasso hinweist, dass jede Anfrage für eine andere Zeile sozusagen ist. Das Dokument sagt, dass " Instanzen dieser Schnittstelle auch verglichen werden, um festzustellen, ob View Recycling stattfindet ", so da jede Anfrage ein neu erstelltes CustomTarget Objekt hat, werden keine zwei Anfragen das gleiche Objekt haben und ein Zeilen-Recycling wird nicht erkannt.

    Du benutzt auch viewHolder. In diesem Fall denke ich, dass der ViewHolder die Target Schnittstelle erweitern sollte (wenn man nur 1 Bild pro Zeile hat). Auf diese Weise können Sie jedes Mal, wenn Sie einen Download anfordern, das gleiche Objekt verwenden und kein neues erstellen.

    Sie delegieren auch die Implementierung Ihres CustomTarget in die Implementierung des CustomTarget . Stellen Sie sicher, dass ImageView's equals und hashCode Funktionen erfüllt die Anforderungen, die Picasso fragt.

    Einige Infos zur Implementierung von equals und hashCode : Welche Probleme sollten bei der Überlagerung von equals und hashCode in Java berücksichtigt werden?

    Es scheint, Ihre Gleichheit Methode ist gebrochen. Sie vergleichen eine Bildansicht mit einem benutzerdefinierten Ziel. Dies könnte es beheben:

     public boolean equals(Object o) { if(o instanceof CustomTarget) { return ((CustomTarget) o).imageView.equals(this.imageView); } return super.equals(o); } 
    Das Android ist ein Google Android Fan-Website, Alles ├╝ber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.