如何从基于水平 LinearLayoutManager 的 RecyclerView 中仅隐藏一个单击的项目标题

问题描述 投票:0回答:1

我正在使用水平

LinearLayoutManager
在我的
RecyclerView
上创建水平列表,如下图所示 enter image description here

我的目的是当我单击 RecyclerView 项目标题时隐藏它。但是,当我单击第一个项目标题来隐藏它时,它已成功隐藏,但位置 8、15、22、29 等的项目标题也被隐藏,如下图所示。

enter image description here enter image description here

我的适配器:

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));
android android-studio android-recyclerview nestedrecyclerview linearlayoutmanager
1个回答
0
投票

这是

RecyclerView
的预期行为。根据文档

以前用于显示特定适配器位置数据的视图可以放置在缓存中,以便稍后重用以再次显示相同类型的数据。

如果您想避免这种行为(同时失去

RecyclerView
的优势),您可能需要在
setIsRecyclable()
RecyclerView
上使用
ViewHolder
方法:

@Override
public void onBindViewHolder(final MyViewHolder holder, final int i) {
    ...

    holder.setIsRecyclable(false);
}

此时,如果您有时间进行重构,您也可以考虑使用

ListView
,因为这就是这段代码本质上将您的
RecyclerView
转换为的内容(至少在行为方面)。

© www.soinside.com 2019 - 2024. All rights reserved.