Android developmentAndroid tutorial

Select multiple images from android gallery with thumbnails

Hii Developer In This android tutorial, I am sharing how to select multiple images for the android gallery and show thumbnails. On a button click open a gallery and select multiple files for the gallery.  And show all select files in a list. and I user wants to remove any image to remove these.

How to select multiple images from the gallery in android? like whats App Facebook you select multiple files and upload to Facebook and whats App also. So In this file.  So let’s Start on Solution.

Start You Android Studio and Make a Project with Empty Screen And follow these Step by step to make your solution is an easy way.

Select multiple images from the android gallery with thumbnails.

Step 1: Main Screen XML file.

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@drawable/edit_text"
    android:orientation="vertical">

    <EditText
        android:id="@+id/edComment"
        android:layout_width="match_parent"
        android:layout_height="200dp"
        android:layout_margin="5dp"
        android:background="@drawable/edit_text"
        android:gravity="top"
        android:hint="Write your commetns hare"
        android:inputType="textMultiLine"
        android:padding="10dp" />

    <TextView
        android:id="@+id/buttonAttachment"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:drawableLeft="@drawable/attach"
        android:drawablePadding="15dp"
        android:onClick="onClick"
        android:padding="15dp"
        android:text="Attach" />
</LinearLayout>

<androidx.recyclerview.widget.RecyclerView
    android:id="@+id/newAttachmentList"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" />

On button Attach ClickListener open Gallery and select multiple files you this method.
public void openFolder() {

    Uri uri = Uri.parse(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).getAbsolutePath());
    Intent intent = new Intent();
    intent.setType("*/*");
    intent.putExtra(Intent.EXTRA_STREAM,uri);
    intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true);
    intent.setAction(Intent.ACTION_GET_CONTENT);
    startActivityForResult(Intent.createChooser(intent, "Select Picture"), PICK_FROM_GALLERY);
}

After these use StartActivityFor Result to get the results of Intent for a gallery.

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == PICK_FROM_GALLERY && resultCode == Activity.RESULT_OK) {
        if (data.getClipData() != null) {
            int count = data.getClipData().getItemCount(); //evaluate the count before the for loop --- otherwise, the count is evaluated every loop.
            for (int i = 0; i < count; i++) {
                Uri returnUri = data.getClipData().getItemAt(i).getUri();

                Cursor returnCursor = getContentResolver().query(returnUri, null, null, null, null);
                int nameIndex = returnCursor.getColumnIndex(OpenableColumns.DISPLAY_NAME);
                int sizeIndex = returnCursor.getColumnIndex(OpenableColumns.SIZE);
                returnCursor.moveToFirst();
                System.out.println("PIYUSH NAME IS" + returnCursor.getString(nameIndex));
                System.out.println("PIYUSH SIZE IS" + Long.toString(returnCursor.getLong(sizeIndex)));
                AttachmentListData attachmentListData = new AttachmentListData();
                attachmentListData.setImageName(returnCursor.getString(nameIndex));
                attachmentListData.setImageID(returnUri.toString());
                newAttachmentList.add(attachmentListData);

            }

        } else if (data.getData() != null) {
            Uri returnUri = data.getData();

            Cursor returnCursor =
                    getContentResolver().query(returnUri, null, null, null, null);
            int nameIndex = returnCursor.getColumnIndex(OpenableColumns.DISPLAY_NAME);
            int sizeIndex = returnCursor.getColumnIndex(OpenableColumns.SIZE);
            returnCursor.moveToFirst();
            System.out.println("PIYUSH NAME IS" + returnCursor.getString(nameIndex));
            System.out.println("PIYUSH SIZE IS" + Long.toString(returnCursor.getLong(sizeIndex)));
            AttachmentListData attachmentListData = new AttachmentListData();
            attachmentListData.setImageName(returnCursor.getString(nameIndex));
            attachmentListData.setImageID(returnUri.toString());
            newAttachmentList.add(attachmentListData);
        }
        generateNewAttachmentList(newAttachmentList);
    }
}

 Step 2 Main Screen Java File Source code.

public class TicketDetailsActivity extends BaseActivity implements View.OnClickListener {
    private static final int PICK_FROM_GALLERY = 101;
  
    @BindView(R.id.buttonAttachment)
    TextView buttonAttachment;
    @BindView(R.id.newAttachmentList)
    RecyclerView newAttachmentListView;
    private ArrayList<AttachmentListData> newAttachmentList = new ArrayList<>();
    AttachmentListAdapter attachmentListAdapter;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_tickets_details);
        ButterKnife.bind(this);
       
    }

    @Override
    public void onClick(View view) {
        switch (view.getId()) {
            case R.id.buttonAttachment:
                openFolder();
                break;
        }

    }

    public void openFolder() {

        Uri uri = Uri.parse(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).getAbsolutePath());
        Intent intent = new Intent();
        intent.setType("*/*");
        intent.putExtra(Intent.EXTRA_STREAM,uri);
        intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true);
        intent.setAction(Intent.ACTION_GET_CONTENT);
        startActivityForResult(Intent.createChooser(intent, "Select Picture"), PICK_FROM_GALLERY);
    }

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == PICK_FROM_GALLERY && resultCode == Activity.RESULT_OK) {
            if (data.getClipData() != null) {
                int count = data.getClipData().getItemCount(); //evaluate the count before the for loop --- otherwise, the count is evaluated every loop.
                for (int i = 0; i < count; i++) {
                    Uri returnUri = data.getClipData().getItemAt(i).getUri();

                    Cursor returnCursor = getContentResolver().query(returnUri, null, null, null, null);
                    int nameIndex = returnCursor.getColumnIndex(OpenableColumns.DISPLAY_NAME);
                    int sizeIndex = returnCursor.getColumnIndex(OpenableColumns.SIZE);
                    returnCursor.moveToFirst();
                    System.out.println("PIYUSH NAME IS" + returnCursor.getString(nameIndex));
                    System.out.println("PIYUSH SIZE IS" + Long.toString(returnCursor.getLong(sizeIndex)));
                    AttachmentListData attachmentListData = new AttachmentListData();
                    attachmentListData.setImageName(returnCursor.getString(nameIndex));
                    attachmentListData.setImageID(returnUri.toString());
                    newAttachmentList.add(attachmentListData);

                }

            } else if (data.getData() != null) {
                Uri returnUri = data.getData();

                Cursor returnCursor =
                        getContentResolver().query(returnUri, null, null, null, null);
                int nameIndex = returnCursor.getColumnIndex(OpenableColumns.DISPLAY_NAME);
                int sizeIndex = returnCursor.getColumnIndex(OpenableColumns.SIZE);
                returnCursor.moveToFirst();
                System.out.println("PIYUSH NAME IS" + returnCursor.getString(nameIndex));
                System.out.println("PIYUSH SIZE IS" + Long.toString(returnCursor.getLong(sizeIndex)));
                AttachmentListData attachmentListData = new AttachmentListData();
                attachmentListData.setImageName(returnCursor.getString(nameIndex));
                attachmentListData.setImageID(returnUri.toString());
                newAttachmentList.add(attachmentListData);
            }
            generateNewAttachmentList(newAttachmentList);
        }
    }

    private void generateNewAttachmentList(ArrayList<AttachmentListData> newAttachmentList) {
        newAttachmentListView.setHasFixedSize(true);
        LinearLayoutManager MyLayoutManager = new LinearLayoutManager(TicketDetailsActivity.this);
        MyLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);
        newAttachmentListView.setLayoutManager(MyLayoutManager);
        attachmentListAdapter = new AttachmentListAdapter(newAttachmentList, TicketDetailsActivity.this);
        newAttachmentListView.setAdapter(attachmentListAdapter);
    }

Step 3 Create a Card Layout XML file for Show attach Thumblaine file.

<?xml version="1.0" encoding="utf-8"?>
<androidx.cardview.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:card_view="http://schemas.android.com/apk/res-auto"
    android:id="@+id/ticketNumberCardView"
    android:layout_width="match_parent"
    android:layout_height="40dp"
    card_view:cardBackgroundColor="@color/White"
    card_view:cardCornerRadius="2dp"
    android:layout_margin="5dp">


    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:padding="10dp">

        <ImageView
            android:id="@+id/attachedImageId"
            android:layout_width="30dp"
            android:layout_height="30dp"
            android:layout_alignParentLeft="true"
            android:src="@android:drawable/ic_menu_close_clear_cancel"
            android:layout_centerVertical="true"/>

        <TextView
            android:id="@+id/attachedImageName"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_toRightOf="@id/attachedImageId"
            android:layout_toLeftOf="@id/cancelAttachment"
            android:layout_marginLeft="2dp"
            android:layout_marginRight="2dp"
            android:fontFamily="@font/roboto_regular"
            android:text="The notes on the new age cloud system"
            android:textAppearance="@style/small_body"
            android:layout_centerVertical="true"/>
        <ImageView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@android:drawable/ic_menu_close_clear_cancel"
            android:id="@+id/cancelAttachment"
            android:layout_alignParentRight="true"
            android:layout_centerVertical="true"/>
    </RelativeLayout>
</androidx.cardview.widget.CardView>

Step 4 Create an Adapter class to Set the image and title on the card list view.  

public class AttachmentListAdapter extends RecyclerView.Adapter<AttachmentListAdapter.AttachmentListViewHolder> {
    public ArrayList<AttachmentListData> newAttachmentList;
    public Activity mActivity;


    public AttachmentListAdapter(ArrayList<AttachmentListData> list, Activity activity) {
        newAttachmentList = list;
        mActivity = activity;
    }

    @Override
    public AttachmentListViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.item_newattachment_list, parent, false);

        AttachmentListViewHolder holder = new AttachmentListViewHolder(view, mActivity, newAttachmentList);

        return holder;
    }

    @Override
    public void onBindViewHolder(final AttachmentListViewHolder holder, int position) {
        holder.attachedImageName.setText((newAttachmentList.get(position).getImageName()));
        String userImage = newAttachmentList.get(position).getImageID();
        if (userImage.isEmpty()||userImage.equals(null)||userImage.equals("")) {

        } else {
            Picasso.with(mActivity)
                    .load(userImage)
                    .placeholder(R.drawable.app_logo)
                    .fit().centerCrop()
                    .into( holder.attachedImageId);
        }
    }

    @Override
    public int getItemCount() {
        return newAttachmentList.size();
    }

    class AttachmentListViewHolder extends RecyclerView.ViewHolder {

        @BindView(R.id.attachedImageId)
        ImageView attachedImageId;
        @BindView(R.id.attachedImageName)
        TextView attachedImageName;
        @BindView(R.id.cancelAttachment)
        ImageView cancelAttachment;



        public AttachmentListViewHolder(View view, final Activity activity, ArrayList<AttachmentListData> attachmentList) {
            super(view);
            ButterKnife.bind(this, view);
            cancelAttachment.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    int pos = getAdapterPosition();
                    attachmentList.remove(pos);
                    notifyDataSetChanged();
                }
            });
        }
    }
}

Step 5:  Create a DataObject java Class for getter and setter.

public class AttachmentListData implements Parcelable {
    private String imageName;

    public String getImageName() {
        return imageName;
    }

    public void setImageName(String imageName) {
        this.imageName = imageName;
    }

    public String getImageID() {
        return imageID;
    }

    public void setImageID(String imageID) {
        this.imageID = imageID;
    }

    private String imageID;

    public static final Creator CREATOR = new Creator() {
        public AttachmentListData createFromParcel(Parcel in) {
            return new AttachmentListData(in);
        }

        public AttachmentListData[] newArray(int size) {
            return new AttachmentListData[size];
        }
    };




    public AttachmentListData() {
    }

    public AttachmentListData(Parcel in) {
        super();
        readFromParcel(in);
    }



    public void readFromParcel(Parcel in) {
        imageName = in.readString();
        imageID = in.readString();
    }

    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(imageName);
        dest.writeString(imageID);
    }
}