英文:
How to hide only one clicked item title from a horizontal LinearLayoutManager based RecyclerView
问题
我正在使用水平的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));
英文:
I am using horizontal LinearLayoutManager
to create a horizontal list on my RecyclerView
as shown in the picture below
My purpose is to hide the RecyclerView item title when I click on it. But when I click for example on the first item title to hide it, it is successfully hidden but the titles of items at positions 8,15,22,29, etc are also hidden as shown in the picture below.
My adapter:
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();
}
}
My fragment code
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));
答案1
得分: 1
禁用回收器不是合适的解决方案。请按照以下步骤操作:
- 在
HomeProduitsPromoInnerItem
类中添加一个布尔标志,命名为isShowingTitle
。 - 现在,在您的适配器的
onBindViewHolder()
方法中添加以下条件来显示/隐藏项目标题(将您的holder.nomProduit.setOnClickListener...
行替换为以下内容):
if (singleItem.isShowingTitle) {
holder.nomProduit.setVisibility(View.VISIBLE);
holder.nomProduit.setOnClickListener((OnClickListener) view -> {
singleItem.isShowingTitle = false;
holder.nomProduit.setVisibility(View.INVISIBLE);
});
} else {
holder.nomProduit.setVisibility(View.INVISIBLE);
holder.nomProduit.setOnClickListener(null);
}
使用这种方式,每个项目的标题可见性将存储在 dataSet
列表中。每当 recyclerView 重新绘制项目时,您将获得更新的标题可见性。
在您的问题中,我没有看到您如何使标题可见。因此,我没有在答案中添加那部分内容。
英文:
Disabling recycler is not a proper solution here. do follow following steps:
-
Add one boolean flag in
HomeProduitsPromoInnerItem
class. let's sayisShowingTitle
. -
Now in your adapter's
onBindViewHolder()
method add following condition to show/hide item title (replace yourholder.nomProduit.setOnClickListener...
line with following):if (singleItem.isShowingTitle) { holder.nomProduit.setVisibility(View.VISIBLE); holder.nomProduit.setOnClickListener((OnClickListener) view -> { singleItem.isShowingTitle = false; holder.nomProduit.setVisibility(View.INVISIBLE); }); } else { holder.nomProduit.setVisibility(View.INVISIBLE); holder.nomProduit.setOnClickListener(null); }
using this, every item's title visibility will be stored in dataSet
list. and every time when recyclerView redraw the item, you will get updated title visibility.
In your question, i don't see how you going to make title visible. SO i'm not adding that part in answer.
答案2
得分: 0
- 在你的
HomeProduitsPromoInnerItem
数据类内部添加一个标志,用于保存特定项目的标题可见状态。 - 为项目的标题添加一个监听器,使用
setOnClickListener
处理点击事件(看起来你已经这样做了)。 - 强制刷新 RecyclerView。
- 根据标志值在
onBindViewHolder
中处理项目/标题的可见性。
英文:
- Include a flag inside your
HomeProduitsPromoInnerItem
data class, that will save the title visible state of the specific item. - Add a listener to handle click on the title with a setOnClickListener on your item (seems you already do that).
- Force a RecyclerView refresh.
- Handle the visibility of the item/title inside the
onBindViewHolder
based on the flag value.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论