2016-05-06 8 views
1

Ich möchte Elemente mit einem Adapter in einem ListView anzeigen, aber wenn GetView im ArrayAdapter aufgerufen wird, zeigt es das gute Bild, aber nicht auf das gute Element beim Scrollen. Es ist wie wenn die findViewById mir die gute ID des Layouts nicht geben würde.Android ListView getView Anzeige Bild nach dem Zufallsprinzip

public class ItemPackAdapter extends ArrayAdapter<Pack> { 
Context context; 

public ItemPackAdapter(Context context, ArrayList<Pack> pack) { 
    super(context, 0, pack); 
    this.context = context; 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    ViewHolder holder; 
    // Check if an existing view is being reused, otherwise inflate the view 
    final Pack pack = getItem(position); 
    if (convertView == null) { 
     convertView = LayoutInflater.from(context).inflate(R.layout.item_pack, parent, false); 
     holder = new ViewHolder(); 
     holder.textView1 = (TextView) convertView.findViewById(R.id.textView1); 
     holder.textView2 = (TextView) convertView.findViewById(R.id.textView2); 
     holder.textView3 = (TextView) convertView.findViewById(R.id.textView3); 
     holder.imageView = (ImageView) convertView.findViewById(R.id.imageView); 
     if (!pack.getImageName().equals("null")) { 
      UrlGenerator urlGenerator = new UrlGenerator(); 
      String url = urlGenerator.getDownloadPicture(pack.getImageName()); 
      DownloadPicture downloadPicture = new DownloadPicture(holder.imageView, url, getContext()); 
      downloadPicture.start(); 
     } 
     convertView.setTag(holder); 
    } 
    else { 
     holder = (ViewHolder)convertView.getTag(); 
    } 
    holder.textView1.setText(pack.getSomething1()); 
    holder.textView2.setText(pack.getSomething2()); 
    holder.textView3.setText(pack.getSomething3()); 
    if (!pack.getImageName().equals("null")) { 
     UrlGenerator urlGenerator = new UrlGenerator(); 
     String url = urlGenerator.getDownloadPicture(pack.getImageName()); 
     DownloadPicture downloadPicture = new DownloadPicture(holder.imageView, url, getContext()); 
     downloadPicture.start(); 
    } 
    if(pack.getImageName().equals("null")){ 
     holder.imageView.setImageBitmap(null); 
    } 
    return convertView; 
} 
static class ViewHolder { 
    TextView textView1; 
    TextView textView2; 
    TextView textView3; 
    ImageView imageView; 
} 
} 

Eigentlich fand ich eine Lösung mit:

if(pack.getImageName().equals("null")){ 
     holder.imageView.setImageBitmap(null); 
    } 

Aber wenn ich auf dem Listview verschiebe, kann ich das Bild in dem falschen Artikel sehen, und ich muß wieder blättern getView rufen Löschen Sie das Bild mit der vorherigen Bedingung. Ich möchte etwas sauberer: p

Vielen Dank im Voraus. Und Entschuldigung für mein schlechtes Englisch.

+1

Das Problem ist, bis hin zum Recycling von Ansichten durch. Sie können Picasso oder eine andere Bibliothek zum Laden von Bildern verwenden, um dieses Problem zu vermeiden. –

Antwort

0

In diesem Fall gezeigt, wenn Sie nicht Ihr Bild zwischenspeichern, die Sie dieses Problem geben kann. Verwenden Sie Picasso Bibliothek wird dringend empfohlen, um dieses Problem zu vermeiden. Fügen Sie die picasso Bibliothek in Ihrem Projekt hinzu und schreiben Sie Ihren Code so etwas.

Picasso.with(getApplicationContext()).load(url).into(holder.imageView); 

statt dieser Linie

DownloadPicture downloadPicture = new DownloadPicture(holder.imageView, url, getContext()); 
downloadPicture.start(); 
+0

Ich kannte diese Bibliothek nicht, danke – gfitas

1

Ihre Code-Looks funktionieren gut mit nur ein wenig zwicken. Ich entdeckte, dass Sie die Image zweimal wurden einstellen, so dass ich den Code bearbeiten, wie unter

public class ItemPackAdapter extends ArrayAdapter<Pack> { 
    Context context; 
    ArrayList<Pack> packs; 

    public ItemPackAdapter(Context context, ArrayList<Pack> packs) { 
     super(context, 0, packs); 
     this.context = context; 
     this.packs = packs; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     ViewHolder holder; 
     // Check if an existing view is being reused, otherwise inflate the view 
     final Pack pack = packs.get(position); 
     if (convertView == null) { 
      convertView = LayoutInflater.from(context).inflate(R.layout.item_pack, parent, false); 
      holder = new ViewHolder(); 
      holder.textView1 = (TextView) convertView.findViewById(R.id.textView1); 
      holder.textView2 = (TextView) convertView.findViewById(R.id.textView2); 
      holder.textView3 = (TextView) convertView.findViewById(R.id.textView3); 
      holder.imageView = (ImageView) convertView.findViewById(R.id.imageView); 

      convertView.setTag(holder); 
     } else { 
      holder = (ViewHolder) convertView.getTag(); 
     } 
     if (pack.getImageName().equals("null")) { 
      holder.imageView.setImageBitmap(null); 
     } else { 
      UrlGenerator urlGenerator = new UrlGenerator(); 
      String url = urlGenerator.getDownloadPicture(pack.getImageName()); 
      DownloadPicture downloadPicture = new DownloadPicture(holder.imageView, url, getContext()); 
      downloadPicture.start(); 
     } 
     holder.textView1.setText(pack.getSomething1()); 
     holder.textView2.setText(pack.getSomething2()); 
     holder.textView3.setText(pack.getSomething3()); 

     return convertView; 
    } 

    static class ViewHolder { 
     TextView textView1; 
     TextView textView2; 
     TextView textView3; 
     ImageView imageView; 
    } 
} 
+0

Ich habe die Picasso-Bibliothek hinzugefügt und meinen Code so geändert, wie Sie es getan haben, und ich weiß, dass es funktioniert, danke. – gfitas