Note that there are some explanatory texts on larger screens.

plurals
  1. POAndroid listview images shift around
    primarykey
    data
    text
    <p>I've implemented the below code to fill my listview with various images if available and it works but the problem is when other elements on screen are touched or you scroll fast images shift around. Any help would be much appreciated...</p> <pre><code>import java.lang.ref.WeakReference; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Color; import android.graphics.drawable.ColorDrawable; import android.graphics.drawable.Drawable; import android.os.AsyncTask; import android.view.View; import android.widget.ImageView; import android.widget.TableLayout; 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&lt;String, Void, Bitmap&gt; { String url; private final WeakReference&lt;ImageView&gt; imageViewReference; private final WeakReference&lt;TableLayout&gt; imageTableReference; public BitmapDownloaderTask(ImageView imageView, TableLayout imageTable) { imageViewReference = new WeakReference&lt;ImageView&gt;(imageView); imageTableReference = new WeakReference&lt;TableLayout&gt;(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&lt;REQUIRED_SIZE || height_tmp/2&lt;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&lt;BitmapDownloaderTask&gt; bitmapDownloaderTaskReference; public DownloadedDrawable(BitmapDownloaderTask bitmapDownloaderTask) { super(Color.BLACK); bitmapDownloaderTaskReference = new WeakReference&lt;BitmapDownloaderTask&gt;(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; } } </code></pre>
    singulars
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload