【问题标题】:Android - Elements of List are getting replaced automaticallyAndroid - 列表的元素被自动替换
【发布时间】:2015-03-19 18:30:22
【问题描述】:

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

现在,当我填充了所有值并且控制退出循环时,该列表中所有元素的datetime(它们是Calendar 的实例)以某种方式替换为非常最后一个元素的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)。

【问题讨论】:

    标签: android arraylist android-studio


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-16
      • 2014-11-14
      相关资源
      最近更新 更多