2017-07-16 15 views
0

私は食品のリストからrecyclerviewを持っています。アイテムをクリックすると、アイテムがグレー表示されます。今これはうまくいき、私が押す最初の項目は、実際には灰色に変わります。しかし、もう一度押すと、他のセルがグレーに変わります。それからそれは大きな混乱に変わり、ランダムなものがグレーになる。RecyclerView onBindViewHolderクリックリスナーが間違ったセルの内容を変更します

アイテムをクリックすると、FoodItemインスタンスにブール値が設定されていることを設定しました。次に、recyclerviewのデータをリフレッシュして、ブール値を設定したアイテムに灰色のオーバーレイが表示されるようにします。ここで

は私のアダプタです:

[

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(); 
    } 
} 

そして、主な活動は、インターフェイスを実装し、その項目をクリックすると、メインacitivtyに、私はこのコードを持っています。

@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(); 

    } 

どうしてですか?ありがとう

+0

ViewHolderクラスのonclickリスナーを実装し、getAdapterPosiotion()から位置を取得する必要があります。 https://developer.android.com/reference/android/support/v7/widget/RecyclerView.ViewHolder.html#getAdapterPosition() –

答えて

3

他のオプションがありません。

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

にはelseブランチが必要でした。それ以外の場合はリサイクルのため、前のビューを以前の「設定」と再利用することができます。

+0

ありがとうございました。 – RJB

+0

ようこそ。それは非常に一般的な間違いです:) – GVillani82

+0

は、同じことをコメントしようとしていた、それはかなり速い応答です:P –

関連する問題