Я пытаюсь сделать систему заказа еды. Я отображаю 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, затем верните значение и установите текст, который как бы происходит, просто в неправильном месте.