代码之家  ›  专栏  ›  技术社区  ›  RJB

RecyclerView onBindViewHolder click listener更改错误单元格的内容

  •  0
  • RJB  · 技术社区  · 7 年前

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

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

    为什么会这样?谢谢

    1 回复  |  直到 7 年前
        1
  •  3
  •   GVillani82    7 年前

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

    需要一个else分支,否则由于循环,您可以使用以前的“配置”重用以前的视图。