我正在尝试制作食品订购系统。我正在显示4个单独的recyclerview项目,其中包含有关不同菜单选项的信息,并且可以选择其上的向上或向下箭头来更改特定项目的数量。我遇到的问题是,当我单击一个“视图”项目上的任一箭头时,它会更新列表中最低的项目(例如,如果我单击顶部项目上的向上箭头,则会使计数器变大)。底部的项目改为一个)。我知道有些问题与此类似,但是我发现的解决方案都没有帮助或相关。
我尝试了几种不同的更改值的方法,我最初认为这是由于在适配器中使用了全局变量,但我对此进行了更改,但它没有执行任何操作。我相信问题在于,它无法区分项目,而且我不确定如何做到这一点。
这是我的适配器代码(为方便起见略有修饰):
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);
}
}
}
这是该活动的摘录(我正在使用一个片段包含recycleview):
@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,然后返回值并设置文本,这就是正在发生的事情,只是在错误的地方。
答案 0 :(得分:0)
就对RecyclerView
项的位置的错误解释而言,通常是当它们在onBindViewHolder()
中的值是最终值时发生。
我建议您从MenuAdapter
类中删除这些成员变量。
public MenuViewHolder holder;
public int position;
由于要在内部类中使用viewholder和position的值,因此应创建两个变量的本地实例。在onBindViewHolder()
内,您应该写:
MenuViewHolder holder = thisHolder;
int position = thisPosition;
现在在onBindViewHolder()
或内部类中使用这两个。如果需要,它们也可以是最终的,但是onBindViewHolder()
的参数不应该是最终的,因为它会引起对位置和视图持有者项目的错误解释。