将数组列表中的数据显示到列表视图,计算每个重复对象并显示为一个对象

Posted

技术标签:

【中文标题】将数组列表中的数据显示到列表视图,计算每个重复对象并显示为一个对象【英文标题】:Display data from arraylist to a listview, counting every repeating object and show as one object 【发布时间】:2018-06-06 09:52:17 【问题描述】:

我是 android 新手,正在开发电子商务应用程序。我有一个产品的模型类(指定产品名称、价格等)。

public class Product implements Serializable 

    /**
     * The item Merchant Name.
     */
    private String merchantName = "";

    /**
     * The item desc.
     */
    private String description = "";

    /**
     * The mrp.
     */
    private String mrp;

    /**
     * The discount.
     */
    private String discount;

    /**
     * The image url.
     */
    private int imageUrl;

    private String productName = "";

    private String productId = "";

    public Product(String description, String mrp, String discount,
                   int imageUrl, String productName, String productId, String merchantName) 

        this.description = description;
        this.mrp = mrp;
        this.discount = discount;
        this.imageUrl = imageUrl;
        this.productName = productName;
        this.productId = productId;
        this.merchantName=merchantName;
    

    public void setMerchantName(String merchantName) 
        this.merchantName = merchantName;
    

    public void setDescription(String description) 
        this.description = description;
    

    public void setMrp(String mrp) 
        this.mrp = mrp;
    

    public void setDiscount(String discount) 
        this.discount = discount;
    

    public void setImageUrl(int imageUrl) 
        this.imageUrl = imageUrl;
    

    public void setProductName(String productName) 
        this.productName = productName;
    

    public void setProductId(String productId) 
        this.productId = productId;
    

    public String getMerchantName()
        return merchantName; 

    public String getDescription() 
        return description;
    

    public String getMrp() 
        return mrp;
    

    public String getDiscount() 
        return discount;
    

    public int getImageUrl() 
        return imageUrl;
    

    public String getProductName() 
        return productName;
    

    public String getProductId() 
        return productId;
    


我想将产品从数组列表显示到列表视图。但是,如果 arraylist 中有两次相同的产品(具有相同的 productId),我希望它在 ListView 上仅显示一行,数量为 2(请参见图片)。谁能帮我解决这个问题?

这是列表视图适配器类:

public class MyOrdersProducts_Adapter extends BaseAdapter 

    Activity activity;
    ArrayList<Product> cartproductsList;
    Product tempValues;

    public MyOrdersProducts_Adapter(Activity activity,ArrayList<Product> cartproductsList)
        this.activity=activity;
        this.cartproductsList=cartproductsList;
    

    @Override
    public int getCount() 
        return cartproductsList.size();
    

    @Override
    public Object getItem(int i) 
        return cartproductsList.get(i);
    

    @Override
    public long getItemId(int i) 
        return i;
    

    class MyViewHolder
        CheckBox checkBox;
        ImageView imageView;
        LinearLayout listRow;
        TextView price,title,quantity;

        public MyViewHolder(View v)
            checkBox=v.findViewById(R.id.checkbox_product);
            imageView=v.findViewById(R.id.img_product_list);
            price=v.findViewById(R.id.price_productlist);
            title=v.findViewById(R.id.title_productlist);
            quantity=v.findViewById(R.id.quantity_productlist);
            listRow=v.findViewById(R.id.productlist_row);

        
    

    @Override
    public View getView(int i, View view, ViewGroup viewGroup) 

        View rowView=view;
        MyViewHolder holder;

        if(rowView==null)
            LayoutInflater inflater=activity.getLayoutInflater();
            rowView=inflater.inflate(R.layout.myordersproducts_row,null);
            holder=new MyViewHolder(rowView);
            rowView.setTag(holder);
        
        else
            holder= (MyViewHolder) rowView.getTag();
        tempValues=cartproductsList.get(i);

        holder.imageView.setImageResource(tempValues.getImageUrl());
        holder.title.setText(tempValues.getProductName());
        holder.price.setText(tempValues.getMrp());

        return rowView;
    

编辑:

请注意我不能使用 HashSet(用于创建唯一列表)或 HashMap(用于映射具有整数计数值的产品),因为我无法将数据从 HashSets 设置到 BaseAdapter。

【问题讨论】:

重复***.com/questions/11448129/… Make a unique list of objects Java的可能重复 在将其设置到适配器之前尝试检查重复的产品,这比在回收站/列表视图中计算更容易 谢谢@UMESH0492 请看编辑。 【参考方案1】:

但是如果arraylist中有相同的产品(具有相同的productId) 两次

为什么不避免在ArrayList 中添加具有相同product id 的产品?在ArrayList 中添加任何产品之前,请检查ArrayList 中的任何现有产品是否具有相同的product id。如果存在具有相同product id 的产品,则不要添加该产品。这样,您将拥有 ArrayList 的产品,其中包含独特的 product id's

【讨论】:

感谢您的回答,但这将创建一个唯一列表。我还需要显示数量(产品重复的次数)。请注意,我无法在 Product 模型类中添加数量变量。【参考方案2】:

您需要在向 ArrayList 添加项目时添加一个检查,以查看是否已经存在相同的产品。确保在产品类中添加数量字段,当您遇到重复时,只需增加数量即可。

【讨论】:

在产品模型类中添加数量变量在我的项目中不是一个好主意。请您提出一个替代解决方案吗?【参考方案3】:

在添加到RecyclerView之前过滤数据,例如这样:

// Beware, this is pseudo code
void addData(List<Product> items) 
    HashMap<String, ProductItem> newItems = new HashMap<>();
    for (ProductItem item: items) 
        if (newItems.containsKey(item.id)) 
            newItems.get(item.id).incrementQuantity();
         else 
            newItems.put(item.id, item);
        
     
     adapter.add(newItems.values())

【讨论】:

以上是关于将数组列表中的数据显示到列表视图,计算每个重复对象并显示为一个对象的主要内容,如果未能解决你的问题,请参考以下文章

使用 ng-repeat 显示包含重复对象的对象子数组列表,每个索引有 1 个项目符号

使用 Baseadapter 时列表视图中的联系人图像重复

选择添加到 SwiftUI 列表的新项目

从最新到最旧的python对Mongo列表进行排序[重复]

我如何从firebase检索数据到android listview顶部[重复]

将对象添加到数组后,tableview 不会更新