2017-02-15 10 views
1

Я искал часы, и я не могу найти свою ошибку, на самом деле это не имеет никакого смысла.Список копирует себя во все элементы родительского списка

У меня есть приложение для Android, которое имеет класс, отвечающий за разбор XML-документа с помощью XmlPullParser. Результатом является список школьных дней, в которых содержится некоторая информация о дне, а также список уроков за каждый день. Я могу правильно извлечь всю эту информацию, но по какой-то причине я заканчиваю тем же списком уроков для каждого дня в конце (другая информация заголовка этого элемента остается верной). Полный метод можно найти здесь (слишком долго, чтобы вставить его здесь): http://pastebin.com/AwxqwxQb

Я просто опубликовать план здесь:

List<SubstitutionDay> parseReturnSubstitution() { 
    SubstitutionDay currentSubstitutionDay = new SubstitutionDay(); 
    List<SubstitutionDay> results = new ArrayList<>(); 
    Substitution currentSubstitution = new Substitution(); 
    List<Substitution> currentSubstitutionList = new ArrayList<>(); 
    int multipleClasses = 0, multiplePeriods = 0; 
    String text = ""; 

    try { 
     // all the XmlPullParser set up 

     int eventType = xmlPullParser.getEventType(); 

     while (eventType != END_DOCUMENT) { 
      String tag; 
      String[] tempStringArray; 

      tag = xmlPullParser.getName(); 
      switch (eventType) { 
       case TEXT: 
        text = xmlPullParser.getText(); 
        break; 

       case START_TAG: 
        switch (tag) { 
         case "kopf": 
          // reset the school day 
          currentSubstitutionDay = new SubstitutionDay(); 
          break; 
         case "haupt": 
          // empty the list before new elements are added 
          currentSubstitutionList.clear(); 
          break; 
         case "aktion": 
          // reset values for each new substitution 
          currentSubstitution = new Substitution(); 
          multipleClasses = 0; 
          multiplePeriods = 0; 
          break; 
        } 
        break; 

       case END_TAG: 
        switch (tag) { 
         // iterate over xml elements that contain header information about the day 

         // iterate over the individual lessons 
         case "klasse": 

          break; 
         case "stunde": 

          break; 
         case "lehrer": 

          break; 
         case "raum": 

          break; 
         case "info": 

          break; 

         case "aktion": 

          break; 

         case "haupt": 
          // add the list of lessons to the day 
          // the number of lessons is correct here 
          currentSubstitutionDay.setSubstitutionList(currentSubstitutionList); 
          // add the whole day to the result set 
          // number of lessons is still correct 
          results.add(currentSubstitutionDay); 

          break; 
        } 
        break; 
      } 
      eventType = xmlPullParser.next(); 
     } 
    } // catch statements follow here 

    // when I check for the size of results.get(i).getSubstitutionList().size() the size is the same for all elements 
    return results; 
} 

Я действительно беспомощны прямо здесь, так как это не происходит вообще , У кого-нибудь есть объяснение? Любая помощь приветствуется. Если вам нужна дополнительная информация, просто дайте мне знать!

Edit: XML, который распознаётся можно найти здесь: http://vplankl.gymnasium-beetzendorf.de/Vertretungsplan_Klassen.xml

Результаты Я ожидаю, что в основном количество строк из каждой таблицы. Однако если для одной строки используется два периода (имя столбца: Stunde) (например, 4-5), результат увеличивается на единицу, потому что я храню каждую подстановку/урок в одном элементе списка. Число уроков за последний день равно 5 - это число, которое копируется на все остальные дни.

+0

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

+0

Какой класс предназначен для «школьных дней», а для «уроков»? –

+0

Это то, что я делал последние два часа .. SubstitutionDay для школьных дней и содержит список заметок (уроков) – Crosswind

ответ

1

Проблема в том, что вы создаете только один объект List<Substitution> и продолжаете очищать его. Вместо этого вы должны создать новый список для каждого дня.

Кроме того, при добавлении списка в SubstitutionDay вы должны сделать защитную копию.

+0

Вместо очистки, создание нового решало это - что имеет смысл. Спасибо! – Crosswind

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

  • Нет связанных вопросов^_^