Как я могу обновить счетчик для отдельных элементов RecyclerView? - PullRequest
0 голосов
/ 25 октября 2019

Я пытаюсь сделать систему заказа еды. Я отображаю 4 отдельных элемента в окне «Переработчик» с информацией о различных пунктах меню и возможностью выбрать стрелку вверх или вниз для изменения количества определенного элемента. Проблема, с которой я столкнулся, заключается в том, что, когда я нажимаю стрелку на одном элементе просмотра, он обновляет элемент, который является самым низким в списке, вместо этого (например, если бы я должен был щелкнуть стрелку вверх на верхнем элементе, он увеличил бы счетчик нанижний пункт вверх на один вместо). Я знаю, что есть вопросы с похожими проблемами, но ни одно из найденных мной решений не является полезным или актуальным.

Я пробовал несколько разных способов изменения значения, я изначально думал, что это будет связано с использованиемглобальная переменная в адаптере, но я изменил это, и он ничего не сделал. Я полагаю, что проблема в том, что он не различает предметы, и я не уверен, как заставить это сделать это.

Это мой код адаптера (слегка урезанный для удобства):

public class MenuAdapter extends RecyclerView.Adapter<MenuAdapter.MenuViewHolder> {

    private Context context;
    private List<Food> foodList;
    private int userID;
    public MenuViewHolder holder;
    public int position;
    Food food;

    public MenuAdapter(Context context, List<Food> foodList, int userID) {
        this.context = context;
        this.foodList = foodList;
        this.userID = userID;
    }

    @NonNull
    @Override
    public MenuViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        LayoutInflater inflater = LayoutInflater.from(context);
        View view = inflater.inflate(R.layout.menu_item_layout, null);
        return new MenuViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull final MenuViewHolder thisHolder, int thisPosition) {

        holder = thisHolder;
        position = holder.getAdapterPosition();
        holder.itemView.setId(position);

        holder.upArrow.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                int currentValue = Integer.valueOf(holder.counter.getText().toString());
                int thisOrder = BumpCountUp(currentValue);
                holder.counter.setText(String.valueOf(thisOrder));
            }
        });

        holder.downArrow.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                int currentValue = Integer.valueOf(holder.counter.getText().toString());
                if(currentValue > 0) {
                    int thisOrder = BumpCountDown(currentValue);
                    holder.counter.setText(String.valueOf(thisOrder));
                }
            }
        });


    }

    public int BumpCountUp(int count) {
        int orderCount = count + 1;
        return orderCount;
    }


    public int BumpCountDown(int count) {
        int orderCount = count - 1;
        return orderCount;
    }

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


    class MenuViewHolder extends RecyclerView.ViewHolder {

        ImageView foodImage, upArrow, downArrow;
        TextView foodName, counter, price;
        RadioButton choice1, choice2, choice3;


        public MenuViewHolder(@NonNull View itemView) {
            super(itemView);

            counter = itemView.findViewById(R.id.counter);
            upArrow = itemView.findViewById(R.id.upArrow);
            downArrow = itemView.findViewById(R.id.downArrow);
        }
    }
}

И это отрывок из действия (я использую фрагмент для хранения повторного просмотра):

@Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        view = inflater.inflate(R.layout.fragment_order, container, false);


        List<Food> menuList = LoginActivity.tuckBoxDB.tbDao().getAllFoods();

        recyclerView = view.findViewById(R.id.recyclerView);
        recyclerView.setHasFixedSize(true);

        recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));

        adapter = new MenuAdapter(getContext(), menuList, userID);
        recyclerView.setAdapter(adapter);

    }

Я ожидал бы, что это займет представление, найдет назначенный ему счетчик, получит значение,увеличьте / уменьшите его на 1, затем верните значение и установите текст, который как бы происходит, просто в неправильном месте.

1 Ответ

0 голосов
/ 25 октября 2019

Что касается неправильной интерпретации позиции элемента RecyclerView, то обычно это происходит, когда их значение внутри onBindViewHolder() является окончательным.

Я бы предложил вам удалить эти переменные-члены изMenuAdapter class.

public MenuViewHolder holder;
public int position;

Поскольку вы хотите использовать значения viewholder и position внутри внутренних классов, вы должны создать локальный экземпляр обеих переменных. Внутри onBindViewHolder() вы должны написать:

MenuViewHolder holder = thisHolder;
int position = thisPosition;

Теперь используйте эти два внутри onBindViewHolder() или внутренних классов. Они также могут быть окончательными, если это необходимо, но параметры onBindViewHolder() не должны быть окончательными, поскольку это приводит к неправильной интерпретации позиции и элемента держателя.

...