Skip to content

Instantly share code, notes, and snippets.

@snadjafi
Created April 22, 2014 04:54
Show Gist options
  • Save snadjafi/11165705 to your computer and use it in GitHub Desktop.
Save snadjafi/11165705 to your computer and use it in GitHub Desktop.
ResourceCursorAdapter With ViewHolder
import android.content.Context;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.provider.MediaStore;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.ResourceCursorAdapter;
import android.widget.TextView;
import com.clipo.blipo.R;
import com.clipo.blipo.models.BlipoPhoto;
import com.google.common.collect.Lists;
import java.util.List;
public class PhotoCursorAdapter extends ResourceCursorAdapter {
//region Variables
private final static String DEBUG_TAG = "[PhotoCursorAdapter]";
private final List<BlipoPhoto> selectedPhotos;
private final List<Bitmap> downloadedThumbnails;
private final int cursorCount;
//endregion
//region Constructor
public PhotoCursorAdapter(Context context, int layout, Cursor c, int flags, List<BlipoPhoto> selectedPhotos) {
super(context, layout, c, flags);
this.selectedPhotos = selectedPhotos;
this.cursorCount = c.getCount();
this.downloadedThumbnails = Lists.newArrayList();
}
//endregion
@Override
public void bindView(View view, Context context, Cursor cursor) {
Log.w(DEBUG_TAG, "bindView()");
final ViewHolder viewHolder = (ViewHolder) view.getTag();
// Log.d(DEBUG_TAG, "======================");
// Log.d(DEBUG_TAG, "Cursor position = " + cursor.getPosition());
// Log.d(DEBUG_TAG, "Cursor count = " + cursor.getCount());
// Log.d(DEBUG_TAG, "Original count = " + cursorCount);
// Log.d(DEBUG_TAG, "Adapter count = " + getCount());
if (cursor.getPosition() < cursorCount) {
final long id = cursor.getLong(cursor.getColumnIndex(MediaStore.Images.Media._ID));
if (isPhotoSelected(id)) {
viewHolder.selectedImageView.setBackgroundResource(R.drawable.list_focused_blipo_default);
} else {
viewHolder.selectedImageView.setBackgroundResource(android.R.drawable.screen_background_light_transparent);
}
Bitmap thumbnail = MediaStore.Images.Thumbnails.getThumbnail(
context.getContentResolver(),
id,
MediaStore.Images.Thumbnails.MINI_KIND,
null);
viewHolder.photoImageView.setImageBitmap(thumbnail);
} else {
// Log.d(DEBUG_TAG, "downloadedThumbnails.get(getCount() - cursorCount - 1) " + (getCount() - cursorCount - 1));
viewHolder.photoImageView.setImageBitmap(downloadedThumbnails.get(getCount() - cursorCount - 1));
}
// Log.d(DEBUG_TAG, "======================");
}
@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {
Log.w(DEBUG_TAG, "newView()");
View view = super.newView(context, cursor, parent);
ViewHolder viewHolder = new ViewHolder();
viewHolder.photoImageView = (ImageView) view.findViewById(R.id.photo_iv);
viewHolder.selectedImageView = (ImageView) view.findViewById(R.id.selected_iv);
view.setTag(viewHolder);
return view;
}
@Override
public void changeCursor(Cursor cursor) {
Log.w(DEBUG_TAG, "changeCursor()");
super.changeCursor(cursor);
}
@Override
public Cursor getCursor() {
Log.w(DEBUG_TAG, "getCursor()");
return super.getCursor();
}
@Override
public Cursor swapCursor(Cursor newCursor) {
Log.w(DEBUG_TAG, "swapCursor()");
return super.swapCursor(newCursor);
}
@Override
public int getCount() {
return cursorCount + downloadedThumbnails.size() + 1;
}
public void addSelectedPhoto(long photoId) {
selectedPhotos.add(new BlipoPhoto(photoId));
}
public void removeSelectedPhoto(long photoId) {
selectedPhotos.remove(new BlipoPhoto(photoId));
}
public boolean isPhotoSelected(long photoId) {
return selectedPhotos.contains(new BlipoPhoto(photoId));
}
public List<BlipoPhoto> getSelectedPhotos() {
return selectedPhotos;
}
public void addThumbnails(Bitmap bitmap) {
this.downloadedThumbnails.add(bitmap);
}
final static class ViewHolder {
public ImageView photoImageView;
public ImageView selectedImageView;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment