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);
}
}
}
addItemDecoration(headerDecoration); The decoration is also reusable since there is no need to modify the adapter or the RecyclerView at all.
notifyDataSetChanged. Notify any registered observers that the data set has changed. There are two different classes of data change events, item changes and structural changes. Item changes are when a single item has its data updated but no positional changes have occurred.
You need to use this 3 lines to make it work
mItemList.remove(position);
notifyItemRemoved(position);
notifyItemRangeChanged(position, mItemList.size());
private void removerecyclerItem(DraftStoriesPojo list) {
int current_position = allStoriesPojoList.indexOf(list);
allStoriesPojoList.remove(current_position);
notifyItemRemoved(current_position);
notifyItemRangeChanged (current_position, getItemCount());
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With