我有一个班级DailyDetails.java
DailyDetails.java:
public class DailyDetails implements Serializable {
Calendar calendar;
int volume;
int target;
}
我有一个ArrayList(名为tempDD
)。
List<DailyDetails> tempDD = new ArrayList<>();
我想使用后续日历值向此arrayList添加对象(请参阅代码)。
lastAppOpenedDate
和now
是Calendar类的两个实例。
下面是在MainActivity中向arrayList添加对象的代码。
MainActivity.java
while(lastAppOpenedDate.get(Calendar.MINUTE) != now.get(Calendar.MINUTE)) {
DailyDetails dailyDetails = new DailyDetails();
dailyDetails.volume = waterConsumed;
preferences =
PreferenceManager.getDefaultSharedPreferences(this);
if(preferences.getBoolean("default_target",true)) {
dailyDetails.target =
preferences.getInt("defaultTargetValue",4000);
}
else {
dailyDetails.target =
preferences.getInt("customTargetValue",4000);
}
dailyDetails.calendar = lastAppOpenedDate; // Adding the calendar value
tempDD.add(dailyDetails); //Adding object to ArrayList.
if(tempDD.size() > 30 || tempDD.get(0).calendar == tempDD.get(1).calendar) { // Can be ignored right now.
tempDD.remove(0);
}
lastAppOpenedDate.add(Calendar.MINUTE, 1); // Adding one MINUTE to lastAppOpenedDate
waterConsumed = 0;
}
dailyDetails.calendar是关注点。
预期结果:每次循环运行时,都会将一分钟添加到lastAppOpenedDate日历值。因此, 假设arrayList tempDD中的第一个对象具有分钟值5,那么下一个对象应该具有分钟值6,7,8,9,10,11等等。
但是在实际输出中,arrayList的每个对象中日历中的分钟值是相同的。即 我在上面的代码之后添加了这段代码:
String s = "";
for(int i = 0; i < tempDD.size();i++){
s = s + tempDD.get(i).calendar.get(Calendar.MINUTE) + ",";
}
Log.d("Tag A","String: "+s);
这将在日志中打印12,12,12,12,12,12,12 ....
任何帮助将不胜感激。 :)
答案 0 :(得分:4)
您在循环的每次迭代中实例化一个新的DailyDetails
对象。但是,您为其.calender
属性分配了lastAppOpenedDate
的引用 - 而不是副本。
所以你得到了十几个DailyDetails
的列表,所有这些都引用了lastAppOpenedDate
中存储的相同实例。每次在for-i循环中访问它时,一个实例自然会具有相同的值,您已经更新了大约十几次。
将dailyDetails.calendar = lastAppOpenedDate;
更改为
dailyDetails.calendar=lastAppOpenedDate.clone();