RecyclerView does not update after removing an item

13,440

Solution 1

You need to use this 3 lines to make it work

mItemList.remove(position);
notifyItemRemoved(position);
notifyItemRangeChanged(position, mItemList.size());

Solution 2

private void removerecyclerItem(DraftStoriesPojo list) {
        int current_position = allStoriesPojoList.indexOf(list);
        allStoriesPojoList.remove(current_position);
        notifyItemRemoved(current_position);
        notifyItemRangeChanged (current_position, getItemCount());
    }

Solution 3

Declare a method in your custom RecylerView like below

public void DeleteData(int position){

        recordingItems.remove(position);
        notifyItemRemoved(position);
        notifyItemRangeChanged(position, recordingItems.size());
    }

and from mainActivity call

adapter.DeleteData(position);
Share:
13,440
Ashwani Kumar
Author by

Ashwani Kumar

This place is cool!!

Updated on June 13, 2022

Comments

  • Ashwani Kumar
    Ashwani Kumar almost 2 years

    I have a RecyclerView horizontal image slider at the bottom of a fragment. The top of the fragment shows some details. Once the user clicks on the images at the bottom, the idea is to remove that image from the image slider and display its information in the fragment. Now the information shows up but the image does not gets removed from the RecyclerView. Here is what I have coded in the Onclick of the outermost layout. I have tried all the related answers that I could find but nothing worked. They all are in the code. Please let me know what am I doing wrong or what is missing.

    holder.itemRowRelativeLayout.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
    
                if (isFiltering) {
                    mItemList.clear();
                    mItemList.addAll(mOriginalItemList);
                    mItemList.remove(position);// At this point mItemList holds the correct. That is all the images but not the one that was clicked. 
    
                    notifyItemRemoved(position); //solution 1
                    notifyItemRangeRemoved(position, getItemCount()); // solution 2
                    notifyItemRangeRemoved(0, getItemCount()); // solution 3
                    notifyDataSetChanged();//solution 4
                }
            }
        });
    

    Full Code of the adapter

    public class ImageGallery16X9Adapter<T extends GalleryItem> extends RecyclerView.Adapter<ImageGallery16X9Adapter.GalleryItemViewHolder> {
    
    public enum GalleryMode {
        All_SAME,
        FIRST_DIFFERENT
    }
    
    private Context mContext;
    private BasePresenter mPresenter;
    private List<T> mItemList;
    private List<T> mOriginalItemList;
    private GalleryItem mFirstItem;
    private GalleryMode mGalleryMode;
    private int deviceWidth, itemWidth, marginSingle, marginDouble;
    private boolean isFiltering;
    
    public ImageGallery16X9Adapter(Context context, BasePresenter presenter, GalleryMode galleryMode, List<T> itemList, GalleryItem firstItem, boolean isFiltering) {
        mContext = context;
        mPresenter = presenter;
        mGalleryMode = galleryMode;
        mItemList = new ArrayList<>(itemList);
        mOriginalItemList = new ArrayList<>(itemList);
        mFirstItem = firstItem;
        deviceWidth = CommonUtils.getDeviceWidth((Activity) mContext);
        itemWidth = (int) (deviceWidth * 0.9);
        marginDouble = (int) (deviceWidth * 0.05);
        marginSingle = (int) (deviceWidth * 0.025);
        this.isFiltering = isFiltering;
    }
    
    @Override
    public GalleryItemViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        return new GalleryItemViewHolder(LayoutInflater.from(parent.getContext()).
                inflate(R.layout.row_image_gallery_16x9_item, parent, false));
    }
    
    @Override
    public void onBindViewHolder(GalleryItemViewHolder holder, final int position) {
        RecyclerView.LayoutParams layoutParams = (RecyclerView.LayoutParams) holder.itemRowRelativeLayout.getLayoutParams();
        RelativeLayout.LayoutParams rlParams = (RelativeLayout.LayoutParams) holder.itemImageView.getLayoutParams();
        layoutParams.width = itemWidth;
        rlParams.height = (int) (layoutParams.width * Constant.HEIGHT_FACTOR_16X9);
    
        if (position == 0) {
            layoutParams.leftMargin = marginDouble;
            layoutParams.rightMargin = 0;
            if (mGalleryMode == GalleryMode.FIRST_DIFFERENT) {
                holder.itemTitle.setVisibility(View.VISIBLE);
                holder.itemTitle.setText(mFirstItem.getItemTitle());
                if (mFirstItem.getItemImage() != null) {
                    Picasso.with(MyApplication.getAppContext()).load(mFirstItem.getItemImage()).fit().placeholder(R.drawable.error_image).error(R.drawable.error_image).into(holder.itemImageView);
                } else {
                    Picasso.with(MyApplication.getAppContext()).load(R.drawable.error_image).placeholder(R.drawable.error_image).error(R.drawable.error_image).fit().into(holder.itemImageView);
                }
                holder.itemDescription.setText(mFirstItem.getItemDescription());
            }
        } else {
            if (mGalleryMode == GalleryMode.FIRST_DIFFERENT) {
                if (position == mItemList.size()) {
                    layoutParams.rightMargin = marginDouble;
                } else {
                    layoutParams.rightMargin = 0;
                }
            } else {
                if (position == mItemList.size() - 1) {
                    layoutParams.rightMargin = marginDouble;
                } else {
                    layoutParams.rightMargin = 0;
                }
            }
            layoutParams.leftMargin = marginSingle;
        }
    
        int itemPosition = position;
        if (mGalleryMode == GalleryMode.FIRST_DIFFERENT && position > 0) {
            itemPosition = position - 1;
            T item = mItemList.get(itemPosition);
            holder.itemTitle.setVisibility(View.GONE);
            holder.itemDescription.setText(item.getItemDescription());
            Picasso.with(mContext).load(item.getItemImage()).fit().placeholder(R.drawable.error_image).error(R.drawable.error_image).into(holder.itemImageView);
    
        } else if (mGalleryMode == GalleryMode.All_SAME) {
            T item = mItemList.get(itemPosition);
            holder.itemTitle.setVisibility(View.GONE);
            holder.itemDescription.setText(item.getItemDescription());
            Picasso.with(mContext).load(item.getItemImage()).fit().placeholder(R.drawable.error_image).error(R.drawable.error_image).into(holder.itemImageView);
        }
    
        holder.itemRowRelativeLayout.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (mGalleryMode == GalleryMode.FIRST_DIFFERENT) {
                    if (position == 0) {
                        mPresenter.onItemClicked(mFirstItem);
                    } else {
                        mPresenter.onItemClicked(mItemList.get(position - 1));
                    }
                } else {
                    mPresenter.onItemClicked(mItemList.get(position));
                    if (isFiltering) {
                        mItemList.clear();
                        mItemList.addAll(mOriginalItemList);
                        mItemList.remove(position);
    
                        notifyItemRemoved(position); //solution 1
                        notifyItemRangeRemoved(position, getItemCount()); // solution 2
                        notifyItemRangeRemoved(0, getItemCount()); // solution 3
                        notifyDataSetChanged();//solution 4
                    }
                }
            }
        });
    }
    
    @Override
    public int getItemCount() {
        if (mGalleryMode == GalleryMode.FIRST_DIFFERENT)
            return mItemList.size() + 1;
        else
            return mItemList.size();
    }
    
    
    static class GalleryItemViewHolder extends RecyclerView.ViewHolder {
        private final TextView itemDescription, itemTitle;
        private final ImageView itemImageView, itemFavoriteImageView;
        private final RelativeLayout itemRowRelativeLayout;
    
        public GalleryItemViewHolder(View itemView) {
            super(itemView);
            itemRowRelativeLayout = (RelativeLayout) itemView.findViewById(R.id.rl_gallery_item_row);
            itemImageView = (ImageView) itemView.findViewById(R.id.img_gallery_item);
            itemFavoriteImageView = (ImageView) itemView.findViewById(R.id.img_gallery_item_favorite);
            itemTitle = (TextView) itemView.findViewById(R.id.txt_gallery_item_name);
            itemDescription = (TextView) itemView.findViewById(R.id.txt_gallery_item_description);
        }
    }
    

    }