将数组列表中的数据显示到列表视图,计算每个重复对象并显示为一个对象
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 个项目符号