2013-09-02 4 views
0

В моем приложении для Android у меня есть список Appointment объектов, содержащих информацию о назначении. A ListView затем заполняется выбором этих встреч, отсортированным по времени.Изменить предыдущий элемент на итерации

Я написал свой собственный адаптер для этого списка, чтобы иметь возможность вставлять «свободные» встречи, когда есть разрыв между встречами.

Это мой код до сих пор:

ArrayList<Appointment> appointments = new ArrayList<Appointment>(); 
// populate arraylist here 
ListIterator<Appointment> iter = appointments.listIterator(); 
DateTime lastEndTime = new DateTime(); 
int count = 0; 
while (iter.hasNext()){ 
    Appointment appt = iter.next(); 
    lastEndTime = appt.endDateTime; 
    // Skips first iteration 
    if (count > 0) 
    { 
     if (lastEndTime.isAfter(appt.startDateTime)) 
     { 
      if (iter.hasNext()) 
      { 
       Appointment freeAppt = new Appointment(); 
       freeAppt.isFreeTime = true; 
       freeAppt.subject = "Free slot"; 
       freeAppt.startDateTime = lastEndTime; 
       freeAppt.endDateTime = lastEndTime.minusMinutes(-60); // Currently just set to 60 minutes until I solve the problem 
       iter.add(freeAppt); 
      } 
     } 
    } 
    count++; 
} 
DiaryAdapter adapter = new DiaryAdapter(this, R.layout.appointment_info, appointments); 

Проблема, что у меня есть логика одна. Я ломаю себе голову, чтобы попытаться найти решение, но похоже, что отсутствие знаний о java немного меня удерживает.

Чтобы узнать, когда заканчивается назначение «свободного времени», я должен знать, когда начинается следующая «настоящая» встреча. Но я не могу получить эту информацию до следующего цикла итератора, и к этому времени назначение «свободного времени» больше не в контексте.

Как я могу решить эту проблему?

ответ

3

В этом конкретном случае вариант простейшим, вероятно, вообще не должен использовать итератор. Вы уже привязаны к List (а не только к любому Iterable), чтобы вы могли просто держать счетчик и использовать get().

В качестве альтернативы, учитывая, что вы используете ListIterator, вы можете использовать метод previous(), чтобы вернуться к предыдущему элементу. Все дело в том, что вы считаете более простым, но я предполагаю, что будет легче понять код, используя явные индексы. (Это значит, что вы можете удалить часть if (count > 0) ...)

+0

И вот я подумал, что я так умен, используя итератор! Когда на самом деле, моя первая мысль была счетчиком. –

+0

Благодарим за дополнительную информацию. Преимущество, которое я нашел для использования итератора, состояло в том, что я смог использовать 'iter.add()' для вставки новой строки в текущую позицию. Есть ли хороший эквивалент этому, если я просто использую подход счетчика/индекса? –

+0

@Teifi: Вы просто используете 'List.add' с индексом. –

3

Итерации с использованием индекса вместо итератора и извлечения элементов с помощью appointments.get(). Затем вы можете внести изменения в список при более ранних индексах. Вам просто нужно сделать небольшую бухгалтерскую отчетность, чтобы синхронизация индексации с любыми изменениями в списке.

Смежные вопросы