J'ai une vue d'ensemble à partir d'une liste d'aliments. Lorsque vous cliquez sur l'élément, je veux que l'élément soit grisé. Maintenant, cela fonctionne, et le premier élément que j'appuie devient effectivement gris. Cependant, lorsque je l'appuie de nouveau, certaines autres cellules deviennent grises. Ensuite, il se transforme en un gros gâchis, avec au hasard les grisés?RecyclerView onBindViewHolder cliquez sur l'écouteur pour modifier le contenu de la cellule erronée
Je l'ai configuré que lorsque vous cliquez sur l'élément, l'instance FoodItem a un ensemble booléen. Ensuite, je rafraîchis les données de la vue de recyclage, de sorte que les éléments avec l'ensemble booléen, ont une superposition grise.
Voici mon adaptateur:
[
public class FoodAdapter extends RecyclerView.Adapter<FoodAdapter.MyViewHolder> {
ClickListener clickListener;
private List<FoodItem> foodList;
public void setClickListener(ClickListener clickListener) {
this.clickListener = clickListener;
}
public interface ClickListener {
void ItemClicked(View v, int position);
}
public class MyViewHolder extends RecyclerView.ViewHolder {
public TextView name;
public TextView quantity;
public RelativeLayout background;
public LinearLayout eatenOverlay;
public MyViewHolder(View view) {
super(view);
name = (TextView) view.findViewById(R.id.textView_item_name);
quantity = (TextView) view.findViewById(R.id.textView_item_quantity);
background = (RelativeLayout) view.findViewById(R.id.food_item_background_relative_layout);
eatenOverlay = (LinearLayout) view.findViewById(R.id.eaten_overlay);
}
}
public FoodAdapter(List<FoodItem> foodList) {
this.foodList = foodList;
}
@Override
public FoodAdapter.MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View itemView = LayoutInflater.from(parent.getContext())
.inflate(R.layout.food_item_list, parent, false);
return new MyViewHolder(itemView);
}
@Override
public void onBindViewHolder(FoodAdapter.MyViewHolder holder, final int position) {
FoodItem currentFoodItem = foodList.get(position);
if(currentFoodItem.isHasBeenEaten()){
holder.eatenOverlay.setVisibility(View.VISIBLE);
}
Resources res = holder.itemView.getContext().getResources();
holder.name.setText(currentFoodItem.getName());
holder.quantity.setText(currentFoodItem.getQuantity());
holder.background.setBackgroundResource(currentFoodItem.getImage());
holder.background.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (clickListener != null) {
clickListener.ItemClicked(v, position);
}
}
});
}
@Override
public int getItemCount() {
return foodList.size();
}
}
Et l'activité principale implémente l'interface, de sorte que lorsque l'élément est cliqué, dans la principale acitivty je ce code;
@Override
public void ItemClicked(View v, int position) {
foodList.get(position).setHasBeenEaten(true);
Log.d(TAG,foodList.get(position).getName() + " clicked");
Log.d(TAG,"position: " + position);
mAdapter.notifyDataSetChanged();
}
Pourquoi cela se produit-il? Merci
vous devez implémenter onclick listener dans la classe ViewHolder et obtenir la position de getAdapterPosiotion(); https://developer.android.com/reference/android/support/v7/widget/RecyclerView.ViewHolder.html#getAdapterPosition() –