如何更新单个RecyclerView项目的计数器?

时间:2019-10-25 02:09:19

标签: android android-recyclerview recycler-adapter

我正在尝试制作食品订购系统。我正在显示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,然后返回值并设置文本,这就是正在发生的事情,只是在错误的地方。

1 个答案:

答案 0 :(得分:0)

就对RecyclerView项的位置的错误解释而言,通常是当它们在onBindViewHolder()中的值是最终值时发生。

我建议您从MenuAdapter类中删除这些成员变量。

public MenuViewHolder holder;
public int position;

由于要在内部类中使用viewholder和position的值,因此应创建两个变量的本地实例。在onBindViewHolder()内,您应该写:

MenuViewHolder holder = thisHolder;
int position = thisPosition;

现在在onBindViewHolder()或内部类中使用这两个。如果需要,它们也可以是最终的,但是onBindViewHolder()的参数不应该是最终的,因为它会引起对位置和视图持有者项目的错误解释。