如何隐藏横向LinearLayoutManager的RecyclerView中仅被点击项的标题
解决RecyclerView横向列表点击隐藏标题后复用项异常隐藏的问题
问题原因
RecyclerView 的 ViewHolder 采用复用机制,你直接在点击事件中修改 ViewHolder 内 TextView 的可见性,当该 ViewHolder 被复用到其他列表项(如滚动后的第8、15、22项等)时,会保留之前的隐藏状态,导致这些无关项的标题也被隐藏。
解决方案
1. 扩展数据模型,添加状态字段
在 HomeProduitsPromoInnerItem 类中新增一个布尔字段,用于记录当前项的标题可见状态:
public class HomeProduitsPromoInnerItem { // 原有字段保持不变 private boolean isTitleVisible = true; // 默认标题可见 // 提供getter和setter方法 public boolean isTitleVisible() { return isTitleVisible; } public void setTitleVisible(boolean titleVisible) { isTitleVisible = titleVisible; } }
2. 修改适配器绑定逻辑,基于数据状态更新UI
在适配器的 onBindViewHolder 方法中,根据数据模型的状态设置标题可见性,并在点击事件中更新数据状态后通知适配器刷新:
@Override public void onBindViewHolder(final MyViewHolder holder, final int i) { final HomeProduitsPromoInnerItem singleItem = dataSet.get(i); // 原有赋值逻辑保持不变 holder.nomProduit.setText(singleItem.getNomProduitWithUnite()); holder.prixProduit.setText(singleItem.getPrixProduit()); holder.prixBarre.setText(singleItem.getPrixBarre()); holder.prixBarre.setPaintFlags(holder.prixBarre.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG); int placeholder = R.drawable.ic_category_def; Glide.with(holder.itemView) .load(singleItem.getUrlImage()) .placeholder(placeholder) .fitCenter() .into(holder.itemImage); // 根据数据状态设置标题可见性 holder.nomProduit.setVisibility(singleItem.isTitleVisible() ? View.VISIBLE : View.INVISIBLE); holder.nomProduit.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { // 更新数据模型的状态 singleItem.setTitleVisible(false); // 通知适配器刷新当前位置的项 notifyItemChanged(i); } }); }
通过将UI状态与数据模型绑定,RecyclerView 在复用 ViewHolder 时会根据对应数据的状态重新渲染UI,避免了复用导致的异常状态保留问题。
内容的提问来源于stack exchange,提问作者Landry Joe
相关产品推荐
相关产品推荐

