RecyclerView onBindViewHolder 点击监听更改错误单元格的内容

RecyclerView onBindViewHolder click listener changes contents of wrong cell

我有一份来自食品清单的回收站视图。当您单击该项目时,我希望该项目显示为灰色。现在这确实有效,我按下的第一个项目确实变灰了。但是,当我再次按下它时,其他一些单元格会变成灰色。然后就乱成一团,随机的都变灰了?

我已将其设置为当您单击该项目时,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();
    }
}

而主要 activity 实现了界面,所以当点击项目时,在主要活动中我有这段代码;

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

    }

为什么会这样?谢谢

您只是缺少另一个选项。

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

需要一个 else 分支,否则由于回收,您可以重复使用之前的视图,以及之前的 "configuration"。