Hoori
Hoori

Reputation: 27

How to refresh the Recyclerview when Image is deleted?

In my app, I want to delete the images, which i have done, but every time I delete image, it doesn't refresh the recyclerView. But when I again open the folder then Recyclerview is refreshed.. I want to refresh Recyclerview when image is deleted Here is my code for Deleting an image

@Override
protected void onExternalStoragePermissionGranted() {
    super.onExternalStoragePermissionGranted();

    storage = SimpleStorage.getExternalStorage();
    checkForGalleryDirectories();
    File galleryFiles = new File(path);
    pathContainerView.removeAllViews();
    pathContainerView.addView(createTitleView("Location: " + galleryFiles.getAbsolutePath()));

    File[] files = galleryFiles.listFiles();
    List<GalleryItem> galleryItems = new ArrayList<>();

    String lastModifiedDate = "UNDEFINED";
    SimpleDateFormat formatter = new SimpleDateFormat("E-MMM-yyyy");
    if (files != null) {
        this.adapter.clearGallery();
        for (File file : files) {
            if (file.isDirectory()) {

            } 
                String formattedPicDate = formatter.format(lastMod);
                if (lastModifiedDate != null && !lastModifiedDate.equals(formattedPicDate)) {
                    lastModifiedDate = formattedPicDate;
                    galleryItems.add(new Header(lastModifiedDate));
                    countgridsize++;
                }
                galleryItems.add(new Picture(file.getPath(), file.getName()));

            }
        }
    }
    this.adapter.setGalleryList(galleryItems);
}

 public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
        switch (item.getItemId()) {
            case R.id.action_delete:

                final List<String> list = GalleryAdapter.list;
                DialogInterface.OnClickListener dialogClickListener = new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        switch (which) {
                            case DialogInterface.BUTTON_POSITIVE:
                                //Yes button clicked
                                Toast.makeText(GalleryBrowserActivity.this, "Delete Successfully..", Toast.LENGTH_SHORT).show();
                                for (String fileNameStr : list) {
                                    String[] parts = fileNameStr.split("/");
                                    String part1 = parts[5]; // 004
                                    String part2 = parts[6]; // 034556
                                    storage.deleteFile(".AliRehman/" + part1, part2);
                                }
                                break;

                            case DialogInterface.BUTTON_NEGATIVE:
                                //No button clicked

                                break;
                        }
                    }
                };

                AlertDialog.Builder builder = new AlertDialog.Builder(GalleryBrowserActivity.this);
                builder.setMessage("Are you sure?")
                        .setPositiveButton("Yes", dialogClickListener)
                        .setNegativeButton("No", dialogClickListener).show();

                return true;

My adapter Class

public class GalleryAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {

private final Context context;
private final LayoutInflater layoutInflater;
private List<GalleryItem> galleryList = new ArrayList<>();
private OnItemClickListener mItemClickListener;
public static List<String> list;


public GalleryAdapter(Context context, LayoutInflater layoutInflater) {
    this.context = context;
    this.layoutInflater = layoutInflater;
}

public void setItemClickListener(OnItemClickListener listener) {
    mItemClickListener = listener;
}

public void setGalleryList(List<GalleryItem> galleryList) {
    this.galleryList = galleryList;
    notifyDataSetChanged();
}


@Override
public int getItemViewType(int position) {
    return this.galleryList.get(position).getItemType();
}

@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    if(viewType == GalleryItem.HEADER_TYPE) {
        return new HeaderHolder(layoutInflater.inflate(R.layout.item_header, parent, false));
    } else {
        return new PictureHolder(layoutInflater.inflate(R.layout.item_picture, parent, false));
    }
}

@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
    GalleryItem item = galleryList.get(position);
    if(getItemViewType(position) == GalleryItem.HEADER_TYPE) {
        bindHeaderHolder((HeaderHolder) holder, (Header) item);
    }
    else {
        bindPictureHolder((PictureHolder) holder, (Picture) item);
    }
}

private void bindPictureHolder(final PictureHolder holder, Picture picture) {
    Glide.with(context).load(Uri.fromFile(new File(picture.getPath()))).into(holder.pictureThumbnail);
    boolean itemselected=picture.getSelected();
    if(itemselected)
    {
        Log.d("ViewVisiblePicture", String.valueOf(picture.getPath()));
        holder.overlayView.setVisibility(View.VISIBLE);
    }
    else
        holder.overlayView.setVisibility(View.GONE);
}

private void bindHeaderHolder(HeaderHolder holder, Header header) {
    holder.headerTxt.setText(header.getName());
}

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

public void clearGallery() {
    this.galleryList.clear();
    notifyDataSetChanged();
}
public class HeaderHolder extends RecyclerView.ViewHolder {

    private TextView headerTxt;

    public HeaderHolder(View itemView) {
        super(itemView);
        this.headerTxt = (TextView) itemView.findViewById(R.id.headerTxt);
    }
}

public class PictureHolder extends RecyclerView.ViewHolder implements View.OnClickListener, View.OnLongClickListener {

    public ImageView pictureThumbnail;
    public FrameLayout overlayView;
    public PictureHolder pictureHolder;
    private boolean[] thumbnailsselection;
    public PictureHolder(View itemView) {
        super(itemView);
        itemView.setOnClickListener(this);
        itemView.setOnLongClickListener(this);
        this.pictureThumbnail = (ImageView) itemView.findViewById(R.id.pictureThumbnail);
        this.overlayView = (FrameLayout) itemView.findViewById(R.id.overlayView);
    }
    @Override
    public boolean onLongClick(View view) {
        list=new ArrayList<>();
        if (mItemClickListener != null) {
            mItemClickListener.onItemLongClick(getAdapterPosition());
            this.overlayView.setVisibility(View.VISIBLE);
            Picture model=(Picture) galleryList.get(getAdapterPosition());

            //galleryList.get(getAdapterPosition());
            model.setSelected(true);
            list.add(model.getPath());
            Log.d("Path1", model.getPath());
            final int len = GalleryBrowserActivity.countgridsize;
            int count = 0;
           /* String selectImages = "";
            for (int i = 0; i < len; i++) {
                *//*if (pictureHolder..get(i).selection) {
                    count++;
                    selectImages = selectImages
                            + pictureHolder.images.get(i).id + ",";
                }*//*
                this.overlayView.setVisibility(View.VISIBLE);
            }
            Log.d("Length", len+"");
            if (count == 0) {
                Toast.makeText(context,
                        "Please select at least one image",
                        Toast.LENGTH_LONG).show();
            }*/

            return true;
        }
        Log.d("hi","hello Image");
        notifyDataSetChanged();
        return false;
    }
    @Override
    public void onClick(View v)
    {
        int position = getAdapterPosition();
        Picture picture = (Picture) galleryList.get(position);
        if(GalleryBrowserActivity.mActionMode!=null)
        {
            Log.d("Visiblilty","visible");
            Picture model=(Picture) galleryList.get(getAdapterPosition());
            if(model.getSelected()){
                this.overlayView.setVisibility(View.GONE);
                model.setSelected(false);
                list.remove(model.getPath());
            }else {
                mItemClickListener.onItemClick(position, v, picture.getPath());
                Toast.makeText(context, "visible" + picture.getPath(), Toast.LENGTH_LONG).show();
                this.overlayView.setVisibility(View.VISIBLE);
                model.setSelected(true);
                list.add(model.getPath());
                Log.d("Path2", model.getPath());
            }
            notifyDataSetChanged();
        }
        if (GalleryBrowserActivity.mActionMode==null) {
            Log.d("Visible","invisible");
            Toast.makeText(context,"invisible",Toast.LENGTH_LONG).show();
            mItemClickListener.onItemClick(position, v, picture.getPath());
        }
    }
}
public interface OnItemClickListener
{
    void onItemClick(int position, View v, String picturePath);
    void onItemLongClick(int position);
}
}

Upvotes: 1

Views: 3045

Answers (3)

himanshu1496
himanshu1496

Reputation: 1921

I would suggest you to make below changes:

In GalleryAdapter :

From:

public static List<String> list;

To:

public static List< GalleryItem > list;

And add a function in your GalleryAdapter to remove items from your galleryList:

public void removeItem(GalleryItem item){
    this.galleryList.remove(item);
    notifyDataSetChanged();
}

And In PictureHolder:

@Override
public boolean onLongClick(View view) {
    list=new ArrayList<>();
    if (mItemClickListener != null) {
        mItemClickListener.onItemLongClick(getAdapterPosition());
        this.overlayView.setVisibility(View.VISIBLE);
        GalleryItem model=(GalleryItem) galleryList.get(getAdapterPosition());

        //galleryList.get(getAdapterPosition());
        ((Picture)model).setSelected(true);
        list.add(model);
        Log.d("Path1", ((Picture)model).getPath());
        final int len = GalleryBrowserActivity.countgridsize;
        int count = 0;
        return true;
    }
    Log.d("hi","hello Image");
    notifyDataSetChanged();
    return false;
}

@Override
public void onClick(View v)
{
    int position = getAdapterPosition();
    GalleryItem picture = (GalleryItem) galleryList.get(position);
    if(GalleryBrowserActivity.mActionMode!=null)
    {
        Log.d("Visiblilty","visible");
        GalleryItem model=(GalleryItem) galleryList.get(getAdapterPosition());
        if(model.getSelected()){
            this.overlayView.setVisibility(View.GONE);
            ((Picture)model).setSelected(false);
            list.remove(model);
        }else {
            mItemClickListener.onItemClick(position, v, picture.getPath());
            Toast.makeText(context, "visible" + picture.getPath(), Toast.LENGTH_LONG).show();
            this.overlayView.setVisibility(View.VISIBLE);
            ((Picture)model).setSelected(true);
            list.add(model);
            Log.d("Path2", model.getPath());
        }
        notifyDataSetChanged();
    }
    if (GalleryBrowserActivity.mActionMode==null) {
        Log.d("Visible","invisible");
        Toast.makeText(context,"invisible",Toast.LENGTH_LONG).show();
        mItemClickListener.onItemClick(position, v, picture.getPath());
    }
}

In the above code I am trying to update the list with selected GallryItem objects. And While deleting item after the DialogInterface.BUTTON_POSITIVE is clicked, update the code like below:

case DialogInterface.BUTTON_POSITIVE:
                            //Yes button clicked
                            Toast.makeText(GalleryBrowserActivity.this, "Delete Successfully..", Toast.LENGTH_SHORT).show();
                            for (GalleryItem item : list) {
                                this.adapter.removeItem(item);
                                String fileNameStr = ((Picture)item).getPath();
                                String[] parts = fileNameStr.split("/");
                                String part1 = parts[5]; // 004
                                String part2 = parts[6]; // 034556
                                storage.deleteFile(".AliRehman/" + part1, part2);
                            }
                            break;

The above code will also update the galleryList inside adapter and notify the dataset change. Please let me know if you face any issue while implementing it.

Upvotes: 1

Aritra Roy
Aritra Roy

Reputation: 15615

All you need to do is call notifyDataSetChanged() which will notify the RecyclerView to re-bin the views again, thereby deleting any item as necessary.

Just add a method in your adapter class,

mAdapter.notifyDataSetChanged();

If you know the position of the particular item which is getting deleted, then it is RECOMMENDED to use,

mAdapter.notifyItemChanged(position);

This will give you a nice animation effect while deleting the item.

Upvotes: 1

Mehul Kabaria
Mehul Kabaria

Reputation: 6622

you have to notify your adapter after you delete your image. like below.

arrayAdapter.notifyDataSetChanged();

in your example you have to write above line after you click Yes in your AlertDialog.

Upvotes: 1

Related Questions