ImageView Listview

M

masterkot

Neues Mitglied
0
Hallo zusammen,

ich habe Probleme mit meinem ListView. Ich habe mir einen eigenen Adapter gebaut, der mir jeweils ein Image vom Server ziehen soll und dieses dann passend zu jeder Spalte anzeigen soll. Folgender Code wird benutzt:

Code:
public class ImageDownload extends AsyncTask<String, Void, Bitmap> {
    private final WeakReference imageViewReference;
 
    public ImageDownload(ImageView imageView) {
        imageViewReference = new WeakReference(imageView);
    }
 
    @Override
    // Actual download method, run in the task thread
    protected Bitmap doInBackground(String... params) {
        // params comes from the execute() call: params[0] is the url.
        return downloadBitmap(params[0]);
    }
 
    @Override
    // Once the image is downloaded, associates it to the imageView
    protected void onPostExecute(Bitmap bitmap) {
        if (isCancelled()) {
            bitmap = null;
        }
 
        if (imageViewReference != null) {
            ImageView imageView = (ImageView) imageViewReference.get();
            if (imageView != null) {
 
                if (bitmap != null) {
                    imageView.setImageBitmap(bitmap);
                } else {
                    imageView.setImageDrawable(imageView.getContext().getResources()
                            .getDrawable(R.drawable.pic1));
                }
            }
 
        }
    }
    
    static Bitmap downloadBitmap(String url) {
        final AndroidHttpClient client = AndroidHttpClient.newInstance("Android");
        final HttpGet getRequest = new HttpGet(url);
        try {
            HttpResponse response = client.execute(getRequest);
            final int statusCode = response.getStatusLine().getStatusCode();
            if (statusCode != HttpStatus.SC_OK) {
                Log.w("ImageDownloader", "Error " + statusCode
                        + " while retrieving bitmap from " + url);
                return null;
            }
 
            final HttpEntity entity = response.getEntity();
            if (entity != null) {
                InputStream inputStream = null;
                try {
                    inputStream = entity.getContent();
                    final Bitmap bitmap = BitmapFactory.decodeStream(inputStream);
                    return bitmap;
                } finally {
                    if (inputStream != null) {
                        inputStream.close();
                    }
                    entity.consumeContent();
                }
            }
        } catch (Exception e) {
            // Could provide a more explicit error message for IOException or
            // IllegalStateException
            getRequest.abort();
            Log.w("ImageDownloader", "Error while retrieving bitmap from " + url);
        } finally {
            if (client != null) {
                client.close();
            }
        }
        return null;
    }
 
}

Der Aufruf erfolgt so (in getView vom Adapter):

Code:
if (viewHolder.imgPic != null) {
					    String strUrl = mainUrl+list.get(position).getUrl();
			            new ImageDownload(viewHolder.imgPic).execute(strUrl);
			        }

Ich habe jetzt folgendes Problem:
Im ListView werden 2 Datensätze gleichzeitig angezeigt.
Ich unterscheide die Bilder auf dem Server über die id. Also auf dem Server liegen die z.B. so: id_4.png, damit ich weiß, welcher Datensatz welches Bild bekommt. Kleine Zwischenfrage: Bin da auf keine andere Lösung gekommen, ist das gut so?

Zur Hauptfrage:
Wenn die Bilder geladen werden, rufe ich dir Url ja über list.get(position) ab. Die ersten beiden Bilder, die angezeigt werden, funktionieren auch soweit. Erst wenn ich weiter runter scrolle, dann kommt er da durcheinander. Ich bin mir nicht ganz sicher, aber das hat anscheinend damit zu tun, dass die folgenden Datensätze teils die gleiche Url bekommen. Das scheint ja an der Position zu liegen. Zählt die Position vom getView nur von denen, die momentan angezeigt werden? Wie schaffe ich es, dass jeder Datensatz sein Bild geladen bekommt?

Liebe Grüße
Mats
 
Im Adapter im getView darfst du nicht jedesmal dein convertView neu holen. Nur wenn es null ist..
 
Folgendes habe ich drin:

Code:
if (convertView == null) {
......
} else {
view = convertView;
}

Das ist doch das?
 

Ähnliche Themen

A
Antworten
10
Aufrufe
1.034
swa00
swa00
D
Antworten
9
Aufrufe
1.786
jogimuc
J
4
  • 469110
Antworten
0
Aufrufe
980
469110
4
Zurück
Oben Unten