Reputation: 66
My question is how do i select multiple images from gallery and dynamically add ImageViews for each photo? I have tried multiple methods but i just cant get the one that fits my situation. As i am a newbie i cant figure out myself how to do this.
What i tried:
btn=(Button)findViewById(R.id.imageButton);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent();
intent.setType("image/*");
intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true);
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(Intent.createChooser(intent,"Select Picture"), PICK_IMAGE_MULTIPLE);
}
});
--
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
try {
// When an Image is picked
if (requestCode == PICK_IMAGE_MULTIPLE && resultCode == RESULT_OK
&& null != data) {
// Get the Image from data
String[] filePathColumn = { MediaStore.Images.Media.DATA };
imagesEncodedList = new ArrayList<String>();
if(data.getData()!=null){
Uri mImageUri=data.getData();
// Get the cursor
Cursor cursor = getContentResolver().query(mImageUri,
filePathColumn, null, null, null);
// Move to first row
cursor.moveToFirst();
int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
imageEncoded = cursor.getString(columnIndex);
cursor.close();
}else {
if (data.getClipData() != null) {
ClipData mClipData = data.getClipData();
ArrayList<Uri> mArrayUri = new ArrayList<Uri>();
for (int i = 0; i < mClipData.getItemCount(); i++) {
ClipData.Item item = mClipData.getItemAt(i);
Uri uri = item.getUri();
mArrayUri.add(uri);
// Get the cursor
Cursor cursor = getContentResolver().query(uri, filePathColumn, null, null, null);
// Move to first row
cursor.moveToFirst();
int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
imageEncoded = cursor.getString(columnIndex);
imagesEncodedList.add(imageEncoded);
cursor.close();
}
Log.v("LOG_TAG", "Selected Images" + mArrayUri.size());
}
}
} else {
Toast.makeText(this, "You haven't picked Image",
Toast.LENGTH_LONG).show();
}
} catch (Exception e) {
Toast.makeText(this, "Something went wrong", Toast.LENGTH_LONG)
.show();
}
super.onActivityResult(requestCode, resultCode, data);
}
I have a working image selector but only for 1 picture:
Can i somehow change this so it can handle multiple images and add ImageViews programmaticaly?
private static int RESULT_LOAD_IMAGE = 1;
btn=(Button)findViewById(R.id.imageButton);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent i = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
startActivityForResult(i, RESULT_LOAD_IMAGE);
if (ContextCompat.checkSelfPermission(MainComp_News_Edit.this,
Manifest.permission.READ_EXTERNAL_STORAGE)
!= PackageManager.PERMISSION_GRANTED) {
if (ActivityCompat.shouldShowRequestPermissionRationale(MainComp_News_Edit.this,
Manifest.permission.READ_EXTERNAL_STORAGE)) {
} else {
ActivityCompat.requestPermissions(MainComp_News_Edit.this,
new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},
MY_PERMISSIONS_REQUEST_READ_EXTERNAL_STORAGE);
}
}
}
});
--
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
try{
if (requestCode == RESULT_LOAD_IMAGE && resultCode == RESULT_OK && null != data) {
Uri selectedImage = data.getData();
String[] filePathColumn = { MediaStore.Images.Media.DATA };
Cursor cursor = getContentResolver().query(selectedImage,
filePathColumn, null, null, null);
cursor.moveToFirst();
int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
picturePath = cursor.getString(columnIndex);
cursor.close();
ImageView imageView = (ImageView) findViewById(R.id.imageView);
imageView.setImageBitmap(BitmapFactory.decodeFile(picturePath));
}
}
catch(Exception e) {
e.printStackTrace();
}
}
Translations: Selecteer een foto = Select a photo. Verwijder Foto = Delete photo.
Upvotes: 0
Views: 7273
Reputation: 1603
Call that Function when you get the uri of the images you selected
Add following lines in build graddle files
compile 'com.squareup.picasso:picasso:2.5.2'
compile 'com.android.support:cardview-v7:23.1.1'
recyclerView_myc
<com.pacakage.AutofitRecyclerView
android:id="@+id/recyclerView_myc"
android:layout_marginTop="3dp"
android:background="@color/AppBackGroundColor"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:layout_marginLeft="@dimen/activity_vertical_margin"
android:layout_marginStart="@dimen/activity_vertical_margin"
android:layout_marginRight="1dp"
android:layout_marginEnd="1dp"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/view" />
previewMediaInGrid Function
private ArrayList<String> mArrayUri; //uri of images you selected
private void previewMediaInGrid(ArrayList<String> mArrayUri) {
recyclerView= (AutofitRecyclerView) findViewById(R.id.recyclerView_myc); //recyclerView_myc will be autofitrecyelrview
recyclerView.setVisibility(View.VISIBLE);
vidPreview.setVisibility(View.GONE);
imgPreview.setVisibility(View.GONE);
mAdapter = new GridAdapterUpload(mArrayUri, getApplicationContext());
recyclerView.setAdapter(mAdapter);
}
GridAdapterUpload
public class GridAdapterUpload extends RecyclerView.Adapter<GridAdapterUpload.ViewHolder> {
private ArrayList<String> mItems;
private MyClickListener myClickListener;
private Context mContext;
private String TAG="GridAdapter";
//private ProgressBar mProgressBar;
public GridAdapterUpload(ArrayList<String> items,Context mContext) {
this.mItems = items;
this.mContext= mContext;
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.galary_item, viewGroup, false);
return new ViewHolder(v);
}
@Override
public void onBindViewHolder(final ViewHolder viewHolder, final int position) {
viewHolder.mProgbar.setVisibility(View.VISIBLE);
viewHolder.mProgbar.getIndeterminateDrawable().setColorFilter(ContextCompat.getColor(mContext,
R.color.colorButton), android.graphics.PorterDuff.Mode.MULTIPLY);
Picasso.with(mContext)
.load(new File(mItems.get(position)))
.into(viewHolder.imgThumbnail, new com.squareup.picasso.Callback() {
@Override
public void onSuccess() {
viewHolder.mProgbar.setVisibility(View.INVISIBLE);
}
@Override
public void onError() {
viewHolder.mProgbar.setVisibility(View.INVISIBLE);
}
});
viewHolder.imgThumbnail.setScaleType(ImageView.ScaleType.CENTER_CROP);
}
@Override
public int getItemCount() {
return mItems.size();
}
class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
public ImageView imgThumbnail;
public ProgressBar mProgbar;
public ViewHolder(View itemView) {
super(itemView);
imgThumbnail = (ImageView)itemView.findViewById(R.id.img_thumbnail);
mProgbar = (ProgressBar) itemView.findViewById(R.id.progressBar);
// itemView.setOnClickListener(this);
}
public void onClick(View v) {
myClickListener.onItemClick(getLayoutPosition(), v);
}
}
public interface MyClickListener {
void onItemClick(int position, View v);
}
public void setOnItemClickListener(MyClickListener myClickListener) {
this.myClickListener = myClickListener;
}
}
gallery_item.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:card_view="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:padding="2dp"
android:layout_height="match_parent"
android:orientation="vertical">
<android.support.v7.widget.CardView
android:layout_width="match_parent"
android:layout_height="wrap_content"
card_view:cardCornerRadius="0dp"
card_view:cardElevation="0.01dp">
<RelativeLayout
android:id="@+id/layout_root"
android:layout_width="match_parent"
android:background="@color/AppUploadCamreaPictureColor"
android:layout_height="100dp">
<ImageView
android:id="@+id/img_thumbnail"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_centerHorizontal="true" />
<ProgressBar
android:id="@+id/progressBar"
android:layout_width="25dp"
android:layout_height="25dp"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:visibility="invisible"/>
</RelativeLayout>
</android.support.v7.widget.CardView>
</LinearLayout>
AutofitRecyclerView
public class AutofitRecyclerView extends RecyclerView {
private GridLayoutManager manager;
private int columnWidth = -1;
public AutofitRecyclerView(Context context) {
super(context);
init(context, null);
}
public AutofitRecyclerView(Context context, AttributeSet attrs) {
super(context, attrs);
init(context, attrs);
}
public AutofitRecyclerView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init(context, attrs);
}
private void init(Context context, AttributeSet attrs) {
if (attrs != null) {
int[] attrsArray = {
android.R.attr.columnWidth
};
TypedArray array = context.obtainStyledAttributes(attrs, attrsArray);
columnWidth = array.getDimensionPixelSize(0, -1);
array.recycle();
}
manager = new GridLayoutManager(getContext(),3);
setLayoutManager(manager);
}
@Override
protected void onMeasure(int widthSpec, int heightSpec) {
super.onMeasure(widthSpec, heightSpec);
if (columnWidth > 0) {
int spanCount = Math.max(1, getMeasuredWidth() / columnWidth);
manager.setSpanCount(spanCount);
}
}
}
Upvotes: 1