Android - 列表元素将自动替换

时间:2015-03-19 18:30:23

标签: android arraylist android-studio

我有一个空列表。我用循环中的类实例填充它。在添加实例后,我检索最后一个元素并检查其参数。参数值很好。

现在,当我填写了所有值并且控件退出循环时,该列表中所有元素的datetimeCalendar的实例)以某种方式替换为最后一个元素datetime,而其余参数保持不变。我不知道我的代码中是否存在逻辑错误,或者Android Studio中存在错误

我在输入元素之前和输入该元素之后将值打印到Logcat。值是相同的。但是当控件达到cursor.close()时,该列表中的所有元素都将被替换。

public List<YearChart> readYearChart() throws Exception {
    List<YearChart> yearChart = null;

    SimpleDateFormat dateFormat = TheApplication.getDateFormat();
    SimpleDateFormat timeFormat = TheApplication.getTimeFormat();
    Cursor cursor = sqLiteDatabase.query(MyDatabaseHelper.table_YearChart, super.columnsToRetrieve, null, null, null, null, null);
    if(cursor.moveToFirst()) {
        yearChart = new ArrayList();
        int id;
        Calendar date = Calendar.getInstance();
        int namazId;
        Calendar time = Calendar.getInstance();
        int i=0;
        do
        {
            id = cursor.getInt(cursor.getColumnIndex(super.columnsToRetrieve[0]));
            String dateStr = cursor.getString(cursor.getColumnIndex(super.columnsToRetrieve[1]));
            namazId = cursor.getInt(cursor.getColumnIndex(super.columnsToRetrieve[2]));
            String timeStr = cursor.getString(cursor.getColumnIndex(super.columnsToRetrieve[3]));
            if(!dateStr.isEmpty() && !timeStr.isEmpty())
            {
                date.setTime(dateFormat.parse(dateStr));
                time.setTime(timeFormat.parse(timeStr));
                YearChart yc = new YearChart(id, date, namazId, time);
                Log.v("YearChart_ID  >", String.valueOf(yc.getId()));
                Log.v("YearChart_Date>", TheApplication.getDateFormat().format(yc.getDate().getTime()));
                Log.v("YearChart_NID >", String.valueOf(yc.getNamazId()));
                Log.v("YearChart_Time>", TheApplication.getTimeFormat().format(yc.getTime().getTime()));
                Log.v("*****", "*****");
                yearChart.add(yc);
                YearChart yc1 = yearChart.get(i);
                Log.v("YearChart_ID  >", String.valueOf(yc1.getId()));
                Log.v("YearChart_Date>", TheApplication.getDateFormat().format(yc1.getDate().getTime()));
                Log.v("YearChart_NID >", String.valueOf(yc1.getNamazId()));
                Log.v("YearChart_Time>", TheApplication.getTimeFormat().format(yc1.getTime().getTime()));
                Log.v("*****", "*****");
                i++;
            }
        } while (cursor.moveToNext());
    }
    cursor.close();

    return yearChart;
}

我使用的是Android Studio(v1.1.0)。

1 个答案:

答案 0 :(得分:1)

您将相同的引用传递给日期和时间 - 这意味着列表中的每个元素都包含对这些确切对象的引用。当您调用日期/时间方法时,您将更新所有列表项指向的两个变量。

解决方案是将日期和时间的实例化移动到do-while循环中。