I have a GridView with images that upload thumbnails of image images in the gallery. I load these thumbnails from a class where I call a method with an image identifier and an image, the method sets the bitmap to the transferred image. It works great here, but made the thread stop when we throw the grid.
My problem here is that it pauses while scrolling, but the images repeat in gridview when scrolling from top to bottom. Unable to determine the exact problem. help me out. Thank!
Here's how to set a pause:
imagegrid.setOnScrollListener(new AbsListView.OnScrollListener() {
@Override
public void onScrollStateChanged(AbsListView absListView, int scrollState) {
if (scrollState == AbsListView.OnScrollListener.SCROLL_STATE_FLING) {
bitmapFromId.setPauseWork(true);
} else {
bitmapFromId.setPauseWork(false);
}
}
@Override
public void onScroll(AbsListView absListView, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
}
});
Here is my view in the grdiview adapter:
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView == null) {
holder = new ViewHolder();
convertView = mInflater.inflate(R.layout.galleryitem, null);
holder.imageview = (ImageView) convertView.findViewById(R.id.thumbImage);
holder.checkbox = (CheckBox) convertView.findViewById(R.id.itemCheckBox);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
ImageItem item = images.get(position);
holder.checkbox.setId(position);
holder.imageview.setId(position);
holder.checkbox.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
CheckBox cb = (CheckBox) v;
int id = cb.getId();
if (images.get(id).selection) {
cb.setChecked(false);
images.get(id).selection = false;
} else {
cb.setChecked(true);
images.get(id).selection = true;
}
}
});
holder.imageview.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
int id = v.getId();
ImageItem item = images.get(id);
Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
final String[] columns = { MediaStore.Images.Media.DATA };
Cursor imagecursor = getContentResolver().query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
columns, MediaStore.Images.Media._ID + " = " + item.id, null, MediaStore.Images.Media._ID);
if (imagecursor != null && imagecursor.getCount() > 0) {
imagecursor.moveToPosition(0);
String path = imagecursor.getString(imagecursor
.getColumnIndexOrThrow(MediaStore.Images.Media.DATA));
File file = new File(path);
imagecursor.close();
intent.setDataAndType(Uri.fromFile(file), "image/*");
startActivityForResult(intent, VIEW_IMAGE);
}
}
});
holder.imageview.setLayoutParams(mImageViewLayoutParams);
if (holder.imageview.getLayoutParams().height != mItemHeight) {
holder.imageview.setLayoutParams(mImageViewLayoutParams);
}
bitmapFromId.DisplayImage(item.id, holder.imageview);
holder.checkbox.setChecked(item.selection);
return convertView;
}
My raster image loader class:
public class BitmapFromId {
MemoryCache memoryCache = new MemoryCache();
FileCache fileCache;
private Map<ImageView, String> imageViews = Collections.synchronizedMap(new WeakHashMap<ImageView, String>());
ExecutorService executorService;
Context context;
Handler handler = new Handler();
Resources mResources;
private static final int FADE_IN_TIME = 400;
private final Object mPauseLock = new Object();
private boolean mPaused = false;
public BitmapFromId(Context context) {
fileCache = new FileCache(context);
executorService = Executors.newFixedThreadPool(5);
this.context = context;
mResources = context.getResources();
}
public void DisplayImage(long id, ImageView imageView) {
Bitmap bitmap = null;
String _id = String.valueOf(id);
imageViews.put(imageView, _id);
bitmap = memoryCache.get(_id);
if (bitmap != null)
imageView.setImageBitmap(bitmap);
else {
queuePhoto(_id, imageView);
imageView.setBackgroundResource(R.drawable.empty_photo);
}
}
private void queuePhoto(String id, ImageView imageView) {
PhotoToLoad p = new PhotoToLoad(id, imageView);
executorService.submit(new PhotosLoader(p));
}
private Bitmap getImageFromId(String id) {
Bitmap bitmap;
long _id = Long.parseLong(id);
final String[] columns = { MediaStore.Images.Media.DATA };
final String orderBy = MediaStore.Images.Media._ID;
Cursor imagecursor = context.getContentResolver().query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, columns,
MediaStore.Images.Media._ID + " = " + _id + "", null, orderBy);
int count = imagecursor.getCount();
for (int i = 0; i < count; i++) {
imagecursor.moveToPosition(i);
bitmap = MediaStore.Images.Thumbnails.getThumbnail(context.getContentResolver(), _id,
MediaStore.Images.Thumbnails.MICRO_KIND, null);
return bitmap;
}
imagecursor.close();
return null;
}
private class PhotoToLoad {
public String id;
public ImageView imageView;
public PhotoToLoad(String _i, ImageView i) {
id = _i;
imageView = i;
}
}
class PhotosLoader implements Runnable {
PhotoToLoad photoToLoad;
PhotosLoader(PhotoToLoad photoToLoad) {
this.photoToLoad = photoToLoad;
}
@Override
public void run() {
try {
if (imageViewReused(photoToLoad))
return;
Bitmap bmp = getImageFromId(photoToLoad.id);
memoryCache.put(photoToLoad.id, bmp);
if (imageViewReused(photoToLoad))
return;
BitmapDisplayer bd = new BitmapDisplayer(bmp, photoToLoad);
handler.post(bd);
synchronized (mPauseLock) {
while (mPaused) {
try {
mPauseLock.wait();
} catch (InterruptedException e) {
}
}
}
} catch (Throwable th) {
th.printStackTrace();
}
}
}
boolean imageViewReused(PhotoToLoad photoToLoad) {
String tag = imageViews.get(photoToLoad.imageView);
if (tag == null || !tag.equals(photoToLoad.id))
return true;
return false;
}
class BitmapDisplayer implements Runnable {
Bitmap bitmap;
PhotoToLoad photoToLoad;
public BitmapDisplayer(Bitmap b, PhotoToLoad p) {
bitmap = b;
photoToLoad = p;
}
public void run() {
if (imageViewReused(photoToLoad))
return;
if (bitmap != null) {
final TransitionDrawable td = new TransitionDrawable(new Drawable[] {
new ColorDrawable(android.R.color.transparent), new BitmapDrawable(mResources, bitmap) });
photoToLoad.imageView.setImageDrawable(td);
td.startTransition(FADE_IN_TIME);
} else
photoToLoad.imageView.setImageDrawable(null);
}
}
public void clearCache() {
memoryCache.clear();
fileCache.clear();
}
public void setPauseWork(boolean pauseWork) {
if (pauseWork) {
synchronized (mPauseLock) {
mPaused = true;
}
} else {
synchronized (mPauseLock) {
mPaused = false;
mPauseLock.notifyAll();
}
}
}
}