When scrolling my listview with images. The images will disappear then reappear a second or two later. Any help on the matter would be appreciated!
This is in my getView which calls the below code:
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:
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 doInBackgroun开发者_开发技巧d(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;
}
}
I figured out the problem by reading this question. If you hide some elements then you must show them again :) simple like that.
Well paul as far as your code is concerned you are downloading the images everytime from the desired server whenever you are scrolling through your list view. Probably a bitmap cache implementation could solve your problem.
精彩评论