Android list view images disappear when scrolling

While scrolling my list with images. Images will disappear and then reappear in a second or two. Any help on this will be appreciated!

This is in my getView, which calls the code below:

image_main.setImageBitmap(null); if (curr == 0 && image != null) { list_image.setVisibility(View.VISIBLE); image_preference = preferences.getString("image_preferences", "false"); time_right.setVisibility(View.GONE); if (image_preference.equals("false")) { ImageDownloader imgDwn = new ImageDownloader(); imgDwn.download(image, image_main, image_table); } 

My code is:

 public class ImageDownloader { public void download(String url, ImageView imageView, TableLayout imageTable) { if (cancelPotentialDownload(url, imageView)) { BitmapDownloaderTask task = new BitmapDownloaderTask(imageView, imageTable); DownloadedDrawable downloadedDrawable = new DownloadedDrawable(task); imageView.setImageDrawable(downloadedDrawable); task.execute(url); } } class BitmapDownloaderTask extends AsyncTask<String, Void, Bitmap> { String url; private final WeakReference<ImageView> imageViewReference; private final WeakReference<TableLayout> imageTableReference; public BitmapDownloaderTask(ImageView imageView, TableLayout imageTable) { imageViewReference = new WeakReference<ImageView>(imageView); imageTableReference = new WeakReference<TableLayout>(imageTable); } @Override protected Bitmap doInBackground(String... params) { BitmapFactory.Options o = new BitmapFactory.Options(); o.inJustDecodeBounds = true; BitmapFactory.decodeFile(params[0], o); final int REQUIRED_SIZE=70; //Find the correct scale value. It should be the power of 2. int width_tmp=o.outWidth, height_tmp=o.outHeight; int scale=4; while(true){ if(width_tmp/2<REQUIRED_SIZE || height_tmp/2<REQUIRED_SIZE) break; width_tmp/=2; height_tmp/=2; scale++; } //Decode with inSampleSize BitmapFactory.Options o2 = new BitmapFactory.Options(); o2.inSampleSize=scale; return BitmapFactory.decodeFile(params[0], o2); } @Override protected void onPostExecute(Bitmap result) { if (isCancelled()) { result = null; } if (imageViewReference != null) { ImageView imageView = imageViewReference.get(); TableLayout imageTable = imageTableReference.get(); BitmapDownloaderTask bitmapDownloaderTask = ImageDownloader.getBitmapDownloaderTask(imageView); // Change bitmap only if this process is still associated with it if (this == bitmapDownloaderTask) { imageView.setImageBitmap(result); imageView.setVisibility(View.VISIBLE); imageTable.setVisibility(View.VISIBLE); } } } } static class DownloadedDrawable extends ColorDrawable { private final WeakReference<BitmapDownloaderTask> bitmapDownloaderTaskReference; public DownloadedDrawable(BitmapDownloaderTask bitmapDownloaderTask) { super(Color.BLACK); bitmapDownloaderTaskReference = new WeakReference<BitmapDownloaderTask>(bitmapDownloaderTask); } public BitmapDownloaderTask getBitmapDownloaderTask() { return bitmapDownloaderTaskReference.get(); } } private static boolean cancelPotentialDownload(String url, ImageView imageView) { BitmapDownloaderTask bitmapDownloaderTask = getBitmapDownloaderTask(imageView); if (bitmapDownloaderTask != null) { String bitmapUrl = bitmapDownloaderTask.url; if ((bitmapUrl == null) || (!bitmapUrl.equals(url))) { bitmapDownloaderTask.cancel(true); } else { // The same URL is already being downloaded. return false; } } return true; } private static BitmapDownloaderTask getBitmapDownloaderTask(ImageView imageView) { if (imageView != null) { Drawable drawable = imageView.getDrawable(); if (drawable instanceof DownloadedDrawable) { DownloadedDrawable downloadedDrawable = (DownloadedDrawable)drawable; return downloadedDrawable.getBitmapDownloaderTask(); } } return null; } } 
+7
android listview
source share
2 answers

I understood the problem by reading this question . If you hide some elements, then you should show them again :) just like that.

+4
source share

Well, as far as your code is concerned, every time you download images from the right server every time you scroll through your list. Probably a cache implementation might solve your problem.

0
source share

All Articles