我正在使用水平
LinearLayoutManager
在我的 RecyclerView
上创建水平列表,如下图所示
我的目的是当我单击 RecyclerView 项目标题时隐藏它。但是,当我单击第一个项目标题来隐藏它时,它已成功隐藏,但位置 8、15、22、29 等的项目标题也被隐藏,如下图所示。
我的适配器:
public class HomeProduitsPromoAdapter extends RecyclerView.Adapter<HomeProduitsPromoAdapter.MyViewHolder>{
private List<HomeProduitsPromoInnerItem> dataSet;
private Context mContext;
public HomeProduitsPromoAdapter(Context context, List<HomeProduitsPromoInnerItem> listItems) {
this.dataSet = listItems;
this.mContext = context;
}
public class MyViewHolder extends RecyclerView.ViewHolder {
protected TextView nomProduit,prixProduit,prixBarre;
protected ImageView itemImage;
public MyViewHolder(View view) {
super(view);
this.nomProduit = (TextView) view.findViewById(R.id.textGoodsName);
this.prixProduit = (TextView) view.findViewById(R.id.textGoodsPrice);
this.prixBarre = (TextView) view.findViewById(R.id.textGoodsOldPrice);
this.itemImage = (ImageView) view.findViewById(R.id.imageGoodsPic);
}
}
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent,int viewType) {
View view = LayoutInflater.from(parent.getContext())
.inflate(R.layout.item_home_produits_promo_inner_content, parent, false);
MyViewHolder myViewHolder = new MyViewHolder(view);
return myViewHolder;
}
@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.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
holder.nomProduit.setVisibility(View.INVISIBLE);
}
});
}
@Override
public int getItemCount() {
return dataSet.size();
}
}
我的片段代码
private HomeProduitsPromoAdapter homeMeilleursProduitsAdapter;
homeMeilleursProduitsAdapter=new HomeProduitsPromoAdapter(getContext(), homeProduitsPromoInnerItems);
home_recyclerview_meilleurs_produits.setAdapter(homeMeilleursProduitsAdapter);
home_recyclerview_meilleurs_produits.setLayoutManager(new LinearLayoutManager(getContext(),RecyclerView.HORIZONTAL,false));
这是
RecyclerView
的预期行为。根据文档:
以前用于显示特定适配器位置数据的视图可以放置在缓存中,以便稍后重用以再次显示相同类型的数据。
如果您想避免这种行为(同时失去
RecyclerView
的优势),您可能需要在 setIsRecyclable()
的 RecyclerView
上使用 ViewHolder
方法:
@Override
public void onBindViewHolder(final MyViewHolder holder, final int i) {
...
holder.setIsRecyclable(false);
}
此时,如果您有时间进行重构,您也可以考虑使用
ListView
,因为这就是这段代码本质上将您的 RecyclerView
转换为的内容(至少在行为方面)。