1

我有一個RecyclerView水平圖像滑塊在一個片段的底部。片段的頂部顯示了一些細節。一旦用戶點擊底部的圖像,想法就是從圖像滑塊中移除該圖像並將其信息顯示在片段中。現在信息顯示出來了,但圖像沒有從RecyclerView中刪除。這是我在最外層佈局的Onclick中編碼的內容。我嘗試了所有我能找到的相關答案,但沒有成功。他們都在代碼中。請讓我知道我做錯了什麼或缺少什麼。刪除一個項目後RecyclerView不會更新

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); 
    } 
} 

}的代碼

+0

顯示完整的適配器代碼, –

+0

請參閱此鏈接.. https:// sta ckoverflow.com/questions/26076965/android-recyclerview-addition-removal-of-items –

+0

當你點擊最外層時,請檢查這個方法是否被調用。 (使用日誌記錄來檢查) – Jordan

回答

6

您需要使用這個三線,使其工作

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

爲了讓你的代碼工作,你需要更改適配器構造函數實現如下:

public RecyclerViewAdapter(Context context, List<Model> model) { 
    this.context = context; 
    this.model = model; 
} 

然後在onActivityResult是這樣做的:

@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(); 
    } 
} 
+0

請詳細說明你的答案 – Jordan

+0

@Ashok:上面的代碼適合你嗎? Hitesh Dhamshaniya –

0

沒有必要做這麼多複雜的事情出現了,只需刪除,並通知

holder.itemRowRelativeLayout.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     if (isFiltering) { 
      mItemList.remove(position); 
      notifyItemRemoved(position); 
     } 
    } 
}); 
+0

我必須保留一個原始物品列表,因爲我必須顯示除點擊之外的所有其他圖像。我試過這個解決方案。它在我的代碼中提到。它沒有爲我工作。 –

+0

不需要做mItemList.clear(),mItemList.addAll(mOriginalItemList)這些東西 –

+0

一旦我從主列表中刪除它,我將如何獲取完整的項目集。這就是爲什麼我要維護包含所有項目的另一個列表。這兩條線有一個適當的理由在那裏。請仔細閱讀我在問題中提供的信息。 –

0

只添加這兩條線

mItemList.remove(position); 
notifyDataSetChanged(); 
相關問題