Java 更改微调器项数据时更新recyclerview单行数据

Java 更改微调器项数据时更新recyclerview单行数据,java,android,android-recyclerview,onitemselectedlistener,Java,Android,Android Recyclerview,Onitemselectedlistener,我有一个回收视图,如下图所示 我从服务器获取食物项目数据,并将其绑定到如上所述的RecyclerView 食物项在foodItemList数组列表中分配,该列表具有foodItemType列表数组。在foodItemTypeList数组列表中,存储类型的值及其对应的价格 我想要的是,当用户选择一种食物类型(例如中餐)时,相应的单价会更新 以下是FoodItemAdapter类: public class FoodItemAdapter extends RecyclerView.Adapter&

我有一个
回收视图
,如下图所示

我从服务器获取食物项目数据,并将其绑定到如上所述的
RecyclerView

食物项在
foodItemList
数组列表中分配,该列表具有
foodItemType列表
数组。在
foodItemTypeList
数组列表中,存储类型的值及其对应的价格

我想要的是,当用户选择一种食物类型(例如中餐)时,相应的单价会更新

以下是
FoodItemAdapter
类:

public class FoodItemAdapter extends RecyclerView.Adapter<FoodItemAdapter.CustomViewHolder> {
    private List<FoodItem> foodItemList;
    Context context;
    String token;

    public class CustomViewHolder extends RecyclerView.ViewHolder {
        public TextView food_name, food_unit_price;
        Spinner food_item_type;
        public ImageView food_item_image;
        public Button viewDetail;

        public CustomViewHolder(View view) {
            super(view);
            food_name = (TextView) itemView.findViewById(R.id.food_name);
            food_item_type = (Spinner) itemView.findViewById(R.id.food_item_type);
            viewDetail = (Button) itemView.findViewById(R.id.viewDetail);
            food_unit_price = (TextView) itemView.findViewById(R.id.food_unit_price);
            food_item_image = (ImageView) itemView.findViewById(R.id.food_item_image);
        }
    }

    public FoodItemAdapter(Context context, List<FoodItem> foodItemList,String token) {
        this.foodItemList = foodItemList;
        this.context = context;
        this.token = token;
    }

    @Override
    public CustomViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View itemView = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.food_items_item, parent, false);
        return new CustomViewHolder(itemView);
    }

    @Override
    public void onBindViewHolder(final CustomViewHolder holder, int position) {
        FoodItem foodItem = foodItemList.get(position);
        holder.food_name.setText(foodItem.getFood_name());
        holder.viewDetail.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View v) {

            }
        });

        holder.food_unit_price.setText(foodItem.getFood_unit_price()+" AF");

        if(foodItem.getFood_item_image()!=null && !foodItem.getFood_item_image().isEmpty()){
            Picasso.get()
                    .load(foodItem.getFood_item_image())
                    // To fit image into imageView
                    .resize(50, 50)
                    .centerCrop()
                    .into(holder.food_item_image);
        } else {
            Log.d("Food Item Image:", "Food Item image is either empty or null");
        }

        List<FoodItemType> foodItemTypeList = new ArrayList<>();
        foodItemTypeList = foodItem.getFoodItemTypeList();
        ArrayAdapter userAdapter = new ArrayAdapter(context, R.layout.spinner, foodItemTypeList);
        holder.food_item_type.setAdapter(userAdapter);
        holder.food_item_type.setOnItemSelectedListener(new
            AdapterView.OnItemSelectedListener() {
                @Override
                public void onItemSelected(AdapterView<?> parent, View view, int
                        position, long id) {

                    FoodItemType foodItemType = (FoodItemType) (holder.food_item_type).getSelectedItem();
                    Toast.makeText(context, "Clicked: " +
                            foodItemType.getFood_unit_price(), Toast.LENGTH_LONG).show();
                    FoodItem foodItemNew = new FoodItem(foodItemList.get(holder.getAdapterPosition()).getFood_item_id(),foodItemList.get(holder.getAdapterPosition()).getFood_category_id(),foodItemList.get(holder.getAdapterPosition()).getFood_name(),foodItemList.get(holder.getAdapterPosition()).getFood_item_image(),foodItemList.get(holder.getAdapterPosition()).getFood_item_desc(), foodItemType.getFood_item_type_id(),foodItemType.getFood_item_type_name(),foodItemType.getFood_unit_price(), foodItemList.get(holder.getAdapterPosition()).getFoodItemTypeList());
                    foodItemList.set(holder.getAdapterPosition(),foodItemNew);
                    notifyItemChanged(holder.getAdapterPosition());
                }

                @Override
                public void onNothingSelected(AdapterView<?> parent) {
                    // todo for nothing selected
                }
            });
    }

    @Override
    public int getItemCount() {
        return foodItemList.size();
    }

}
我的问题是:当我滚动
RecyclerView
时,视图会被加载多次(有点滞后),而当我更改foody类型(例如:到medium)时,什么都不会发生


非常感谢您的帮助。

我建议您在
FoodItem
类中有另一个字段,即
selectedFoodType
。这将保存所选类型的索引。默认情况下,使用0初始化该值,当从下拉列表中选择某个项目时,只需相应地更新相应的
FoodItem
selectedFoodType

另一件事是,您不必每次更改
FoodItem
的类型时都创建一个新的
FoodItem
。您只需要选择
foodType
,然后调用
notifyDataSetChanged()

因此,代码应该如下所示。在所选的
函数中,执行以下操作

int foodType = foodItemTypeList.get(position);
FoodItem foodItem = foodItemNew.get(holder.getAdapterPosition());
foodItem.setSelectedFoodType = foodType;
notifyDataSetChanged();

请注意,我还没有测试这段代码。请根据您的需要进行修改。希望有帮助

这是更改食物时单击toast显示的吗?
toast.makeText(上下文,单击:“+foodItemType.getFood\u unit\u price(),toast.LENGTH\u LONG).show()仅用于调试目的。加载
recyclerview
时,type small的价格值会多次显示。我认为问题在于
onBindViewHolder
。它在滚动期间多次调用,导致延迟。我不知道在
onBindViewHolder
Method中实现
setOnItemSelectedListener
是否正确。图像大小如何?是否尝试加载没有图像的相同列表?我尝试了您的答案。我注意到,创造新的食物是滞后造成的。使用
notifyDataSetChanged()
时,微调器下拉列表冻结。因此,我改为
notifyItemChanged(holder.getAdapterPosition())这一次,当我选择一种食物类型(例如中号)时,它会刷新回小号。您还需要在微调器中设置所选项目。使用
selectedFoodType
作为您的
onBindViewHolder
中的微调器选定项。
int foodType = foodItemTypeList.get(position);
FoodItem foodItem = foodItemNew.get(holder.getAdapterPosition());
foodItem.setSelectedFoodType = foodType;
notifyDataSetChanged();