Seriously improved GalleryAdapter

This commit is contained in:
Yedidya Kennard 2016-06-30 15:14:33 +03:00
parent efde2ccff6
commit 960b34a73a
3 changed files with 47 additions and 20 deletions

View File

@ -1,10 +1,10 @@
package com.wix.RNCameraKit; package com.wix.RNCameraKit;
import android.app.Activity;
import android.content.Context; import android.content.Context;
import android.database.Cursor; import android.database.Cursor;
import android.graphics.Bitmap; import android.graphics.Bitmap;
import android.graphics.BitmapFactory; import android.graphics.Color;
import android.os.AsyncTask;
import android.provider.MediaStore; import android.provider.MediaStore;
import android.support.v7.widget.RecyclerView; import android.support.v7.widget.RecyclerView;
import android.view.View; import android.view.View;
@ -12,6 +12,10 @@ import android.view.ViewGroup;
import android.widget.ImageView; import android.widget.ImageView;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections;
import java.util.concurrent.LinkedBlockingDeque;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
/** /**
* Created by yedidyak on 30/06/2016. * Created by yedidyak on 30/06/2016.
@ -20,25 +24,32 @@ public class GalleryAdapter extends RecyclerView.Adapter<GalleryAdapter.StupidHo
public static final String[] PROJECTION = new String[]{ public static final String[] PROJECTION = new String[]{
MediaStore.Images.Media.DATA MediaStore.Images.Media.DATA,
MediaStore.Images.Media._ID
}; };
private ArrayList<String> images = new ArrayList<>(); private ArrayList<String> uris = new ArrayList<>();
private ArrayList<Integer> ids = new ArrayList<>();
public class StupidHolder extends RecyclerView.ViewHolder { public class StupidHolder extends RecyclerView.ViewHolder {
public StupidHolder(View itemView) { public StupidHolder(View itemView) {
super(itemView); super(itemView);
} }
int id;
String uri;
} }
private Context context; private Context context;
private ThreadPoolExecutor executor;
public GalleryAdapter(Context context) { public GalleryAdapter(Context context) {
this.context = context; this.context = context;
int cores = Runtime.getRuntime().availableProcessors();
executor = new ThreadPoolExecutor(cores, cores, 1, TimeUnit.SECONDS, new LinkedBlockingDeque<Runnable>());
} }
public void setAlbum(String albumName) { public void setAlbum(String albumName) {
images.clear(); ids.clear();
String selection = null; String selection = null;
if(albumName != null || !albumName.equals("All Photos")) { if(albumName != null || !albumName.equals("All Photos")) {
@ -55,11 +66,16 @@ public class GalleryAdapter extends RecyclerView.Adapter<GalleryAdapter.StupidHo
if (cursor.moveToFirst()) { if (cursor.moveToFirst()) {
int dataIndex = cursor.getColumnIndex(MediaStore.Images.Media.DATA); int dataIndex = cursor.getColumnIndex(MediaStore.Images.Media.DATA);
int idIndex = cursor.getColumnIndex(MediaStore.Images.Media._ID);
do { do {
images.add(cursor.getString(dataIndex)); uris.add(cursor.getString(dataIndex));
ids.add(cursor.getInt(idIndex));
} while(cursor.moveToNext()); } while(cursor.moveToNext());
} }
Collections.reverse(uris);
Collections.reverse(ids);
cursor.close(); cursor.close();
} }
@ -72,29 +88,42 @@ public class GalleryAdapter extends RecyclerView.Adapter<GalleryAdapter.StupidHo
} }
}; };
v.setScaleType(ImageView.ScaleType.CENTER_CROP); v.setScaleType(ImageView.ScaleType.CENTER_CROP);
v.setBackgroundColor(Color.LTGRAY);
return new StupidHolder(v); return new StupidHolder(v);
} }
@Override @Override
public void onBindViewHolder(final StupidHolder holder, final int position) { public void onBindViewHolder(final StupidHolder holder, final int position) {
new AsyncTask<Void, Void, Bitmap>() { final ImageView imageView = (ImageView)holder.itemView;
@Override imageView.setImageBitmap(null);
protected Bitmap doInBackground(Void... params) { imageView.setBackgroundColor(Color.LTGRAY);
BitmapFactory.Options options = new BitmapFactory.Options(); holder.id = ids.get(position);
options.inSampleSize = 2; holder.uri = uris.get(position);
return BitmapFactory.decodeFile(images.get(position), options);
}
executor.execute(new Runnable() {
@Override @Override
protected void onPostExecute(Bitmap bitmap) { public void run() {
((ImageView)holder.itemView).setImageBitmap(bitmap); final Bitmap bmp = MediaStore.Images.Thumbnails.getThumbnail(
context.getContentResolver(),
ids.get(holder.getAdapterPosition()),
MediaStore.Images.Thumbnails.MINI_KIND,
null);
if (holder.id == ids.get(holder.getAdapterPosition())) {
((Activity) context).runOnUiThread(new Runnable() {
@Override
public void run() {
imageView.setImageBitmap(bmp);
}
});
}
} }
}.execute(); });
} }
@Override @Override
public int getItemCount() { public int getItemCount() {
return images.size(); return ids.size();
} }
} }

View File

@ -24,8 +24,6 @@ public class GalleryViewManager extends SimpleViewManager<GalleryView> {
view.setAlbumName(albumName); view.setAlbumName(albumName);
} }
@ReactProp(name = "minimumInteritemSpacing") @ReactProp(name = "minimumInteritemSpacing")
public void setItemSpacing(GalleryView view, int itemSpacing) { public void setItemSpacing(GalleryView view, int itemSpacing) {
view.setItemSpacing(itemSpacing/2); view.setItemSpacing(itemSpacing/2);
@ -40,5 +38,4 @@ public class GalleryViewManager extends SimpleViewManager<GalleryView> {
public void setColumnCount(GalleryView view, int columnCount) { public void setColumnCount(GalleryView view, int columnCount) {
view.setColumnCount(columnCount); view.setColumnCount(columnCount);
} }
} }

View File

@ -94,6 +94,7 @@ public class NativeGalleryModule extends ReactContextBaseJavaModule {
} }
} while (imagesCursor.moveToNext()); } while (imagesCursor.moveToNext());
} }
imagesCursor.close();
return albums; return albums;
} }