问题
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);
}
}
}
回答1:
You need to use this 3 lines to make it work
mItemList.remove(position);
notifyItemRemoved(position);
notifyItemRangeChanged(position, mItemList.size());
回答2:
private void removerecyclerItem(DraftStoriesPojo list) {
int current_position = allStoriesPojoList.indexOf(list);
allStoriesPojoList.remove(current_position);
notifyItemRemoved(current_position);
notifyItemRangeChanged (current_position, getItemCount());
}
回答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);
回答4:
In order to have your code working you need to change Adapter constructor implementation as follows:
public RecyclerViewAdapter(Context context, List<Model> model) {
this.context = context;
this.model = model;
}
Then in onActivityResult do like this:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == 4) {
listModel.clear();
listModel.addAll(repository.consDataBase(context));
recyclerViewAdapter.notifyDataSetChanged();
}
}
回答5:
No need to do so much complicated things there,simply remove and notify
holder.itemRowRelativeLayout.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (isFiltering) {
mItemList.remove(position);
notifyItemRemoved(position);
}
}
});
回答6:
Only add these two lines
mItemList.remove(position);
notifyDataSetChanged();
回答7:
You need to use these lines to make it work
mItemList.remove(position);
notifyDataSetChanged();
来源:https://stackoverflow.com/questions/45413292/recyclerview-does-not-update-after-removing-an-item