ArrayList keeps getting overwritten for first item

Viewed 54

This is my first time working with Android and Firebase.

I want to delete some of the images on the RecyclerView using checkboxes. But everytime I select any other image on the RecycelrView along with the very first one, for some reason the first one gets overwritten in the ArrayList arrayList of the interface. It does not happen if I select only the first one. It also works if I unselect and then reselect the first image. But the first selection of the first image always gets overwritten.

I will really appreciate it if anyone could help me solve this.

Here is my activity code:

public class ImageViewer extends AppCompatActivity implements ImageDeleteListener {

    private static final int PICK_IMAGE = 1;

    RecyclerView image_viewerHolder;
    ImageViewerAdapter imageViewerAdapter;
    ArrayList<AdImages> image_viewerList;

    FirebaseDatabase database;
    DatabaseReference dbRef;
    StorageReference storageReference;

    private ProgressDialog progressDialog;

    int type;
    String ad_id;

    ArrayList<Uri> ImageList = new ArrayList<Uri>();
    private Uri ImageUri;
    int total_upload_images = 0;
    int count = 1;
    int delete_count = 1;
    int total_ad_images = 0;

    ArrayList<AdImages> deleteList = new ArrayList<>();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_image_viewer);

        image_viewerHolder = findViewById(R.id.ImageViewerHolder);

        progressDialog = new ProgressDialog(this);

        Button delete_image = findViewById(R.id.DeleteImages);
        Button upload_more = findViewById(R.id.UploadMoreImages);

        type = getIntent().getIntExtra("key_loc", 0);

        if (type != 1) {
            delete_image.setVisibility(View.GONE);
            upload_more.setVisibility(View.GONE);
        }

        image_viewerHolder.setHasFixedSize(true);
        image_viewerHolder.setLayoutManager(new LinearLayoutManager(this));

        ad_id = getIntent().getStringExtra("key_ad_id");

        GetAdImages(ad_id);

        upload_more.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent choose_image = new Intent(Intent.ACTION_GET_CONTENT);
                choose_image.setType("image/");
                choose_image.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true);
                startActivityForResult(choose_image, PICK_IMAGE);
            }
        });

        delete_image.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {                
                AlertDialog image_delete_conf = new AlertDialog.Builder(ImageViewer.this).create();
                image_delete_conf.setTitle("Delete Images?");
                image_delete_conf.setMessage("Are You Sure You Want To Delete The Selected Images?");
                image_delete_conf.setButton(AlertDialog.BUTTON_POSITIVE, "YES", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialogInterface, int i) {
                        progressDialog.setMessage("Deleting Images");
                        progressDialog.show();

                        for (AdImages image: deleteList) {
                            System.out.println(image.getImageURL());

                            storageReference = FirebaseStorage.getInstance().getReferenceFromUrl(image.getImageURL().toString());

                            storageReference.delete().addOnSuccessListener(new OnSuccessListener<Void>() {
                                @Override
                                public void onSuccess(Void unused) {

                                    database = FirebaseDatabase.getInstance();
                                    dbRef = database.getReference("ad_images").child(ad_id);

                                    dbRef.removeValue();
                                    
                                    if (delete_count == deleteList.size()) {
                                        Toast.makeText(ImageViewer.this, "Images Deleted From Ad", Toast.LENGTH_LONG).show();

                                        Intent intent_imageviewer = new Intent(ImageViewer.this, ImageViewer.class);

                                        startActivity(intent_imageviewer);
                                        finish();
                                    }

                                    delete_count++;

                                }
                            });
                        }
                    }
                });

                image_delete_conf.setButton(AlertDialog.BUTTON_NEGATIVE, "CANCEL", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialogInterface, int i) {
                        for (AdImages x: deleteList) {
                            System.out.println(x.getImageURL());
                        }
                        image_delete_conf.dismiss();
                    }
                });

                image_delete_conf.show();
            }
        });
    }

    @SuppressLint("SetTextI18n")
    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        if (requestCode == PICK_IMAGE) {
            if (resultCode == RESULT_OK) {
                if (data.getClipData() != null) {
                    int countClipData = data.getClipData().getItemCount();
                    int currentImageSelected = 0;

                    while (currentImageSelected < countClipData) {
                        ImageUri = data.getClipData().getItemAt(currentImageSelected).getUri();
                        ImageList.add(ImageUri);

                        currentImageSelected++;
                    }

                    total_upload_images = ImageList.size();

                    AlertDialog new_upload_conf = new AlertDialog.Builder(ImageViewer.this).create();
                    new_upload_conf.setTitle("Upload Images?");
                    new_upload_conf.setMessage("Are You Sure You Want To Add More Images To This Post?");
                    new_upload_conf.setButton(AlertDialog.BUTTON_POSITIVE, "YES", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialogInterface, int i) {

                            UploadMoreImages();

                        }
                    });

                    new_upload_conf.setButton(AlertDialog.BUTTON_NEGATIVE, "CANCEL", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialogInterface, int i) {
                            new_upload_conf.dismiss();
                        }
                    });

                    new_upload_conf.show();
                }

                else {
                    Toast.makeText(ImageViewer.this, "Please Add Images With Your Post", Toast.LENGTH_LONG).show();
                }
            }
        }
    }

    public String GetFileExtension(Uri uri){
        ContentResolver contentResolver=getContentResolver();
        MimeTypeMap mimeTypeMap=MimeTypeMap.getSingleton();

        return mimeTypeMap.getExtensionFromMimeType(contentResolver.getType(uri));
    }

    void GetAdImages(String ad_id) {
        database = FirebaseDatabase.getInstance();
        dbRef = database.getReference("ad_images").child(ad_id);

        image_viewerList = new ArrayList<>();
        imageViewerAdapter = new ImageViewerAdapter(this, image_viewerList, type, this);

        image_viewerHolder.setAdapter(imageViewerAdapter);

        dbRef.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot snapshot) {
                total_ad_images = Integer.parseInt(String.valueOf(snapshot.getChildrenCount()));
                for (DataSnapshot dataSnapshot : snapshot.getChildren()) {
                    AdImages adImages = dataSnapshot.getValue(AdImages.class);

                    image_viewerList.add(adImages);
                }

                imageViewerAdapter.notifyDataSetChanged();
            }

            @Override
            public void onCancelled(@NonNull DatabaseError error) {

            }
        });

    }

    void UploadMoreImages() {
        progressDialog.setMessage("Uploading Image");
        progressDialog.show();

        storageReference = FirebaseStorage.getInstance().getReference().child("Ad Images").child(ad_id);

        for (int i=0; i<total_upload_images; i++) {
            Uri images = ImageList.get(i);

            String rename_image = "Photo " + String.valueOf(total_ad_images + i + 1)+ "." + GetFileExtension(images);

            StorageReference img_title = storageReference.child(rename_image);

            img_title.putFile(images).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
                @Override
                public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
                    img_title.getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() {
                        @Override
                        public void onSuccess(Uri uri) {
                            String img_url = String.valueOf(uri);

                            AddImageLink(img_url, ad_id);

                            if (count == total_upload_images) {
                                progressDialog.dismiss();
                            }

                            count++;

                        }
                    });
                }
            });
        }
    }

    private void AddImageLink(String url, String ad_id) {
        DatabaseReference databaseReference = FirebaseDatabase.getInstance().getReference("ad_images").child(ad_id);

        HashMap<String, String> ImgMap = new HashMap<>();
        ImgMap.put("imageURL", url);

        databaseReference.push().setValue(ImgMap);
    }

    @Override
    public void onImageDeleteListenerChange(ArrayList<AdImages> arrayList) {

        deleteList = arrayList;
        System.out.println(arrayList.size());
    }
}

Here is the AdImages class:

public class AdImages {

    private String imageURL;

    public String getImageURL() {
        return imageURL;
    }

    public AdImages() {

    }

    public AdImages(String imageURL) {
        this.imageURL = imageURL;
    }
}

Here is the adapter:

public class ImageViewerAdapter extends RecyclerView.Adapter<ImageViewerAdapter.ImageViewerViewHolder> {

    Context context;
    ArrayList<AdImages> image_viewerList;
    int type;
    ImageDeleteListener imageDeleteListener;
    ArrayList<AdImages> image_deleteList;

    public ImageViewerAdapter(Context context, ArrayList<AdImages> image_viewer_List, int type, ImageDeleteListener imageDeleteListener) {
        this.context = context;
        this.image_viewerList = image_viewer_List;
        this.type = type;
        this.imageDeleteListener = imageDeleteListener;
    }

    @NonNull
    @Override
    public ImageViewerViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(context).inflate(R.layout.image_viewer_holder, parent, false);

        return new ImageViewerViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull ImageViewerViewHolder holder, @SuppressLint("RecyclerView") int position) {
        Glide.with(context).load(image_viewerList.get(position).getImageURL()).into(holder.ad_images);

        holder.delete_selection.setVisibility(View.GONE);
        holder.relativeLayout.setMinimumHeight(244);

        if (type == 1) {
            holder.relativeLayout.setMinimumHeight(318);
            holder.delete_selection.setVisibility(View.VISIBLE);
        }

        image_deleteList = new ArrayList<>();

        if (image_viewerList != null && image_viewerList.size() > 0) {
            holder.delete_selection.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    if (holder.delete_selection.isChecked()) {
                        image_deleteList.add(image_viewerList.get(position));
                    }

                    else {
                        image_deleteList.remove(image_viewerList.get(position));
                    }

                    imageDeleteListener.onImageDeleteListenerChange(image_deleteList);
                }
            });
        }
    }

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

    public static class ImageViewerViewHolder extends RecyclerView.ViewHolder {

        ImageView ad_images;
        RelativeLayout relativeLayout;
        CheckBox delete_selection;

        public ImageViewerViewHolder(@NonNull View itemView) {
            super(itemView);

            relativeLayout = itemView.findViewById(R.id.RelLay);
            ad_images = itemView.findViewById(R.id.ViewedAdImage);
            delete_selection = itemView.findViewById(R.id.DeleteImageSelection);
        }
    }
}

Here is the interface:

public interface ImageDeleteListener {
    void onImageDeleteListenerChange(ArrayList<AdImages> arrayList);
}
0 Answers
Related