- 此问题在此处已有答案**:
How to update RecyclerView Adapter Data(16个答案)
去年关闭了。
我在一个片段的底部有一个RecyclerView
的水平图像滑块,片段的顶部显示了一些细节,一旦用户点击底部的图像,我们的想法是从图像滑块中删除该图像,并在片段中显示其信息。现在信息显示出来,但图像没有从RecyclerView
中删除。这是我在最外层布局的Onclick
中编写的代码。我尝试了所有相关的答案,但没有找到任何答案。它们都在代码中。请让我知道我做错了什么或缺少了什么。
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
}
}
});
适配器的完整代码
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);
}
}
}
7条答案
按热度按时间2w3kk1z51#
您需要使用这3行才能使其工作
9w11ddsr2#
qzwqbdag3#
在自定义
RecylerView.Adapter
中声明一个方法,如下所示:以及从
MainActivity
调用:9njqaruj4#
为了使代码正常工作,您需要按如下方式更改Adapter构造函数实现:
然后在onActivityResult中执行以下操作:
slhcrj9b5#
不需要在那里做这么多复杂的事情,只需删除和通知
gzszwxb46#
只加这两行
b4lqfgs47#
您需要使用这些行才能使其工作