2017-07-16 1 views
0

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

+0

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() –

Répondre

3

Il vous manque juste l'autre option.

if(currentFoodItem.isHasBeenEaten()){ 
     holder.eatenOverlay.setVisibility(View.VISIBLE); 
} else { 
     holder.eatenOverlay.setVisibility(View.INVISIBLE); 
} 

besoin d'une autre branche, sinon à cause du recyclage, vous pouvez réutiliser la vue précédente, avec la "configuration" précédente.

+0

Merci, c'était tout! – RJB

+0

De rien. C'est une erreur assez commune :) – GVillani82

+0

était sur le point de commenter la même chose, c'est une réponse assez rapide: P –