Android 更新现有列表项';s数量,而不是添加新项目

Android 更新现有列表项';s数量,而不是添加新项目,android,list,android-recyclerview,android-adapter,Android,List,Android Recyclerview,Android Adapter,我正在开发一个POS管理系统,用户可以从产品列表中选择一个项目,并将所选值添加到检查列表中。单击产品列表后,我可以成功地将新项目添加到检查列表中,但无法更新之前已添加的检查列表项目的数量。请参见图像以获得清晰的演示 从图中可以看到,每个产品项都作为新项添加到了检查列表中,而不是更新数量 我正在寻找一种解决方案,在单击产品列表中的某个项目后更新检查列表数量 这是我的点击监听器,用于产品列表回收视图 recyclerProducts.addOnItemTouchListener(

我正在开发一个POS管理系统,用户可以从产品列表中选择一个项目,并将所选值添加到检查列表中。单击产品列表后,我可以成功地将新项目添加到检查列表中,但无法更新之前已添加的检查列表项目的数量。请参见图像以获得清晰的演示

从图中可以看到,每个产品项都作为新项添加到了检查列表中,而不是更新数量

我正在寻找一种解决方案,在单击产品列表中的某个项目后更新检查列表数量

这是我的点击监听器,用于产品列表回收视图

recyclerProducts.addOnItemTouchListener(
                new RecyclerItemClickListener(getActivity(), new RecyclerItemClickListener.OnItemClickListener() {
                    @Override
                    public void onItemClick(View view, int position) {
                        // TODO Handle item click

                        // productList is the arraylist used in product list 
                        Products product = productList.get(position);

                        Contents c = new Contents();
                        c.setTitle(product.getName());
                        c.setQuantity(product.getQuantity());
                        orderList.add(c);
                        recyclerListAdapter.notifyDataSetChanged();

                    }
                })
        );
这是检查列表的适配器

private List<Contents> contentsList;

    public class MyViewHolder extends RecyclerView.ViewHolder {

        public TextView title;
        public TextView quantity;

        public MyViewHolder(View view) {
            super(view);
            title = (TextView) view.findViewById(R.id.txtTitle);
            quantity = (TextView) view.findViewById(R.id.txtQuantity);
        }
    }

    public RecyclerListAdapter(List<Contents> contentsList) {
        this.contentsList = contentsList;
    }

    @Override
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item_product, parent, false);
        return new MyViewHolder(itemView);
    }

    @Override
    public void onBindViewHolder(MyViewHolder holder, int position) {
        Contents contents = contentsList.get(position);

        holder.title.setText(contents.getTitle());
        holder.quantity.setText("1");
    }

    @Override
    public int getItemCount() {
        return contentsList.size();
    }
私有列表内容列表;
公共类MyViewHolder扩展了RecyclerView.ViewHolder{
公共文本视图标题;
公共文本浏览量;
公共MyViewHolder(视图){
超级(视图);
title=(TextView)view.findViewById(R.id.txtTitle);
quantity=(TextView)view.findViewById(R.id.txtQuantity);
}
}
公共回收站ListAdapter(列表内容列表){
this.contentsList=contentsList;
}
@凌驾
公共MyViewHolder onCreateViewHolder(视图组父级,int-viewType){
View itemView=LayoutFlater.from(parent.getContext()).flate(R.layout.list\u item\u product,parent,false);
返回新的MyViewHolder(itemView);
}
@凌驾
公共无效onBindViewHolder(MyViewHolder,int位置){
Contents=contentsList.get(位置);
holder.title.setText(contents.getTitle());
持有人。数量。设定文本(“1”);
}
@凌驾
public int getItemCount(){
返回contentsList.size();
}

应该这样做

for(Contents contents : orderList){
    if (contents.getTitle().equals(product.getName())){
        contents.setQuantity(product.getQuantity())
        recyclerListAdapter.notifyDataSetChanged();
        return;
    }
//assume existing item was not found and add as before
Contents c = new Contents();
c.setTitle(product.getName());
c.setQuantity(product.getQuantity());
orderList.add(c);
recyclerListAdapter.notifyDataSetChanged();
return;
使用hashmap作为容器而不是列表将是一个更好的选择,因为我假设产品类型/名称是唯一的

地图声明

Map<String,Contents> contentsMap = new HashMap<>();
请注意,哈希映射不需要迭代一组值来更新数量。当需要迭代这些值时,可以像这样使用map.values()方法

for (Contents contents: contentsMap.values()){
     //doSomething with contents, ie. create a view
}

我想你想在这里做的是在你的购物车(存放物品的容器)中,你想知道物品id,因为你已经知道原始列表中的物品id,你可以在每次添加新物品时检查它是否已经存在,如果已经存在,更新它而不是添加新的物品

我假设您将数据(针对每个订单)存储在带有列的本地表中。因此,您只需查询该特定项并更新它是否已经存在

只要我的两分钱,我希望它能帮上忙


祝你好运和快乐

如果不共享实现/代码,您将不会得到太多帮助。请这样做。请添加相关代码。问题已用代码更新!您介意给出一个使用Hashmap的示例吗?最后一个问题,我将如何获得用于在onBindViewHolder()方法中设置textview的单个Hashmap项?之前,我通过以下方式接收项目:Contents=contentsList.get(position);holder.title.setText(contents.getTitle())@ALAN7678有两种方法,一种是保存一个键列表(产品名称)并检索数据,如so map.get(keyList.get(position))。另一种方法是使用values()方法将地图转换为列表。请回答以下相关问题:
for (Contents contents: contentsMap.values()){
     //doSomething with contents, ie. create a view
}