Обновлять данные однострочного просмотра переработчика при изменении данных обтекателя - PullRequest
0 голосов
/ 13 января 2019

У меня есть RecyclerView, как показано на рисунке ниже.

enter image description here

Я получаю данные о продуктах с сервера и привязываю их к RecyclerView, как указано выше.

Продукты питания назначаются в массиве foodItemList, который имеет массив foodItemTypeList. В массиве 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();
    }

}

Часть моего FoodItemsFragment класса выглядит следующим образом:

recyclerView = (RecyclerView) rootView.findViewById(R.id.recycler_food_item);
foodItemAdapter = new FoodItemAdapter(getActivity(),foodItemList, token);
RecyclerView.LayoutManager mLayoutManager = new LinearLayoutManager(getActivity());

recyclerView.setLayoutManager(mLayoutManager);
recyclerView.setItemAnimator(new DefaultItemAnimator());
recyclerView.setAdapter(foodItemAdapter);
foodItemAdapter.notifyDataSetChanged(); 

Моя проблема: когда я прокручиваю RecyclerView, представление загружается несколько раз (что-то запаздывающее), и когда я меняю тип питания (например, на средний), ничего не происходит.

Любая помощь приветствуется.

1 Ответ

0 голосов
/ 13 января 2019

Я хотел бы предложить вам еще одно поле в вашем классе FoodItem, которое selectedFoodType. Это будет содержать индекс выбранного типа. По умолчанию инициализируйте значение 0, а когда элемент выбирается из выпадающего списка, просто обновите соответствующие FoodItem selectedFoodType соответственно.

Другое дело, что вам не нужно создавать новый FoodItem каждый раз, когда вы меняете тип FoodItem. Вам нужно иметь только selectedFoodType, а затем вызвать notifyDataSetChanged().

Таким образом, код должен выглядеть следующим образом. Внутри вашей функции onItemSelected сделайте следующее.

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

Обратите внимание, что я не проверял этот код. Пожалуйста, измените в соответствии с вашими потребностями. Надеюсь, это поможет!

...