1

J'ai un curseur d'image horizontale RecyclerView au bas d'un fragment. Le haut du fragment montre quelques détails. Une fois que l'utilisateur a cliqué sur les images en bas, l'idée est de supprimer cette image du curseur d'image et d'afficher ses informations dans le fragment. Maintenant, l'information apparaît mais l'image n'est pas supprimée du RecyclerView. Voici ce que j'ai codé dans le Onclick de la disposition la plus externe. J'ai essayé toutes les réponses connexes que j'ai pu trouver mais rien n'a fonctionné. Ils sont tous dans le code. S'il vous plaît laissez-moi savoir ce que je fais mal ou ce qui manque.RecyclerView ne se met pas à jour après la suppression d'un élément

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

complet Code de l'adaptateur

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

Afficher le code de la carte complète, –

+0

Veuillez consulter ce lien .. https: // sta ckoverflow.com/questions/26076965/android-recyclerview-addition-removal-of-items –

+0

Veuillez vérifier si cette méthode est appelée ou non lorsque vous cliquez sur la couche la plus externe. (Utilisez la journalisation pour vérifier) ​​ – Jordan

Répondre

6

Vous devez utiliser ces 3 lignes pour le faire fonctionner

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

Afin d'avoir votre code de travail, vous devez changer la mise en œuvre du constructeur Adapter comme suit:

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

Puis, en onActivityResult faire comme ceci:

@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

Veuillez élaborer votre réponse – Jordan

+0

@Ashok: Est-ce que le code ci-dessus fonctionne pour vous? Hitesh Dhamshaniya –

0

Pas besoin de faire tellement de choses compliquées là-bas, il suffit d'enlever et de notifier

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

Je dois maintenir une liste originale d'éléments car je dois afficher toutes les autres images sauf celle sur laquelle j'ai cliqué. J'ai essayé cette solution. Sa mention dans mon code. Cela n'a pas fonctionné pour moi. –

+0

pas besoin de faire mItemList.clear(), mItemList.addAll (mOriginalItemList) ces choses –

+0

Comment vais-je obtenir l'ensemble complet des éléments une fois que je l'ai retiré de la liste principale. C'est pourquoi je maintiens une autre liste qui contient tous les éléments. Ces 2 lignes ont une bonne raison d'être là. Veuillez lire attentivement les informations que j'ai fournies dans la question. –

0

ajouter que ces deux lignes

mItemList.remove(position); 
notifyDataSetChanged();