将数据从arraylist显示到listview,计算每个重复对象并显示为一个对象

时间:2017-12-24 19:47:59

标签: java android listview arraylist

我是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中的产品显示到listview。但是如果arraylist中有相同的产品(使用相同的productId)两次,我希望它只在一行中显示在ListView上,并且数量为2(请参见图片)。有人可以帮我这个吗?

See second and third item displaying seperately in the list

这是listview适配器类:

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(用于映射具有整数计数值的Product),因为我无法从HashSets将数据设置为BaseAdapter。

3 个答案:

答案 0 :(得分:2)

  

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

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

在将数据添加到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())
}