我有两个联系人列表,我希望将其中一个替换为:
private PhoneCAdapter getContactAdapter(ArrayList<UserAgenda> phoneContacts) throws NetworkConnetionException {
List<UserAgenda> serverContacts = WithingsAPI.getInstance().getContactListByType(Common.CONTACT_LIST_TYPE_FILE,"ALL");
for(UserAgenda pc: phoneContacts){
for(UserAgenda sc : serverContacts){
if(pc.getEmails() != null){
ArrayList<String> emailsPc = new ArrayList<String>(pc.getEmails());
for(String epc: emailsPc){
ArrayList<String> emailList = new ArrayList<String>(sc.getEmails());
String emailServer = emailList.get(0);//server contact has only one email
if(epc.equals(emailServer)){//we have to substitute the object from the server with the phone ones.
pc = sc;
}
}
}
}
}
PhoneCAdapter ca = new PhoneCAdapter(this, 0, phoneContacts,PhoneContacts.this );
return ca;
}
但是在循环之后我的变量phoneContacts仍然具有相同的值。仅当我手动更改字段时:
if(epc.equals(emailServer)){
pc.setUserOfWW(sc.getUserOfWW());
if(sc.getInvited().equals("true")){
pc.setInvited("true");
}
else{
pc.setInvited("false");//here we have people who are/arent user of WW
pc.setId2invite(sc.getId2invite());
}
}
如何用我从服务器获得的用户手机中的信息替换我的对象,而不是手动为每个字段做?
答案 0 :(得分:1)
更改用于迭代器的局部变量不会更改集合的内容。了解修改变量值引用的对象与修改变量之间的区别非常重要。如果修改列表中引用所引用的对象,则该更改将通过列表显示。如果修改一个基本上包含该引用的副本的变量,则根本不会影响该列表。
我怀疑你想要:
for (int i = 0; i < phoneContacts.size(); i++) {
UserAgenda pc = phoneContacts.get(i);
for (UserAgenda sc : serverContacts) {
if (pc.getEmails() != null) {
ArrayList<String> emailsPc = new ArrayList<String>(pc.getEmails());
for (String epc: emailsPc) {
ArrayList<String> emailList = new ArrayList<String>(sc.getEmails());
String emailServer = emailList.get(0);
if (epc.equals(emailServer)) {
pc = sc;
// Replace the value in the collection too...
phoneContacts.set(i, sc);
// Do you want to break here?
}
}
}
}
}
目前还不清楚为什么你要在循环中创建数组列表,顺便说一下......(或者为什么你在每次迭代时重新创建相同的电子邮件列表)。基本上代码非常目前还不清楚,我强烈怀疑它可以大大简化 - 但是如果不知道你想要实现什么,就很难这样做。