我有两个ArrayLists:
private ArrayList<MenuItemBean> newList= new ArrayList<MenuItemBean>();
private ArrayList<MenuItemBean> newGroupList= new ArrayList<MenuItemBean>();
在一个函数中,我将数据添加到一个ArrayList:
public void setConfirmList(List<MenuItemBean> cList){
newList.addAll(cList);
listAdapter=new ListAdapter(context, newList);
lv_item.setAdapter(listAdapter);
}
另一个功能,我只是使用for循环对数据进行分组(如果产品已经存在,则增加数量)并将数据添加到第二个ArrayList。但我的问题是当我在ArrayList2中增加数量时,我在ArrayList1中的数量会自动修改。我知道它是因为对象的相同参考。我们可以通过任何方式改变这种行为。
private void groupList(){
newGroupList.clear();
ArrayList<MenuItemBean> mList= new ArrayList<MenuItemBean>();
mList.addAll(newList);
for (int i = 0; i < mList.size(); i++){
String productId = mList.get(i).getProductId();
if(newGroupList.size()==0){
newGroupList.add(mList.get(i));
}else{
Boolean bool=false;
for (int j = 0; j< newGroupList.size(); j++){
if(productId.equalsIgnoreCase(newGroupList.get(j).getProductId())){
bool= true;
// MenuItemBean newObject = new MenuItemBean();
// BeanUtils.copyProperties(newObject, newGroupList.get(j));
MenuItemBean bean= newGroupList.get(j);
int quantity = Integer.parseInt(bean.getUserQuantity());
Double sellingPrice = Double.parseDouble(bean.getSellingPrice());
quantity = quantity + 1;
sellingPrice = sellingPrice * quantity;
bean.setUserQuantity(String.valueOf(quantity));
bean.setUserPrice(String.valueOf(sellingPrice));
newGroupList.set(j, bean);
break;
}
}
if(!bool){
newGroupList.add(mList.get(i));
}
}
}
listAdapter=new ListAdapter(context, newGroupList);
lv_item.setAdapter(listAdapter);
}
我还尝试使用
复制ArrayListArrayList newGroupList= new ArrayList<MenuItem>(newList);
但没有帮助它简单复制数据但不是参考。我试过但没有任何例子来实现它。
答案 0 :(得分:0)
但没有帮助它简单复制数据而不是参考。
你是对的。通过创建新列表并将数据项添加到新列表,它不是复制对象存储器。这些列表中的两个项都指向堆中的相同内存地址。因此,当您修改其中一个列表中的数据项时。这也会影响其他数据项。例如
public static void main(String[] args) {
List<ObjectItem> datas = new ArrayList<ObjectItem>();
ObjectItem obj1 = new ObjectItem();
obj1.setId(1);
datas.add(obj1);
System.out.println("memory addrs for obj1:" + datas.get(0)); //memory addrs for obj1: 533e846f
List<ObjectItem> other_datas = new ArrayList<ObjectItem>();
other_datas.addAll(datas);
System.out.println("memory addrs for obj1:" + other_datas.get(0));//memory addrs for obj1: 533e846f
}
如果您想解决问题,请制作深层复制数据。例如:
public class ObjectItem {
public ObjectItem(ObjectItem other) {
this.id = other.getId();
}
private int id;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
}
然后使用它
List<ObjectItem> new_datas = new ArrayList<ObjectItem>();
for (int i = 0; i < datas.size(); i++) {
new_datas.add(new ObjectItem(datas.get(i)));
}