Aller au contenu

Étrange problème avec un ArrayList


alvinm93

Recommended Posts

Bonjour tout le monde!

J'ai un problème étrange avec mon ArrayList d'un objet personnalisé

public ArrayList<MonObject> getXMLResult(){
	mObjectList = new ArrayList<MonObject>();
	try {
           // creates and returns new instance of SAX-implementation:
           SAXParserFactory factory = SAXParserFactory.newInstance();

           // create SAX-parser...
           SAXParser parser = factory.newSAXParser();
           // .. define our handler:
           MonHandler handler = new MonHandler();

           // and parse:
           parser.parse("file:///sdcard/fichierxml.xml", handler);

       } catch (Exception ex) {
           ex.printStackTrace(System.out);
       }
       return mObjectList;
}
private static final class MonHandler extends DefaultHandler {
    	private String lastElement = "null";
       	static MonObject actualObject = new MonObject();

        // invoked when document-parsing is started:
        public void startDocument() throws SAXException {
            System.out.println("Document processing started");

        }

        // notifies about finish of parsing:
        public void endDocument() throws SAXException {
            for(int i = 0; i<mObjectList.size();i++){
		MonObject focusedObject = mObjectList.get(i);
		System.out.println(focusedObject.getName());
	    }
            System.out.println("Document processing finished");
        }

        // we enter to element 'qName':
        public void startElement(String uri, String localName, 
                String qName, Attributes attrs) throws SAXException {
            if (qName.equals("maintag")) {

            } else if (qName.equals("MonObject")) {
            	actualObject = new MonObject();
            	actualObject.setName(attrs.getValue("name"));
            	mObjectList.add(actualObject);
            /* if (...)
                        } */ else {
                throw new IllegalArgumentException("Element '" + 
                        qName + "' is not allowed here");
                        }
            setLastElement(qName);
        }

        // we leave element 'qName' without any actions:
        public void endElement(String uri, String localName, String qName)
        throws SAXException {
            // do nothing;
        }

		public void setLastElement(String lastElement) {
			this.lastElement = lastElement;
		}

		public String getLastElement() {
			return lastElement;
		}
    }

Mais les System.out de la boucle donnent

object2

object2

object2

au lieu de donner

object0

object1

object2

Pourtant juste avant de l'ajouter dans l'arraylist je fais un MonObject.getName() j'obtient le nom correct

Donc quand j'ajoute un élément à mon ArrayList, tout les autres éléments prennent la valeur du dernier.

Si au lieu de faire un ArrayList de MonObject je fais un arraylist de String là sa marche mais c'est pas le but car j'ai plusieurs variables puis plus tard une liste dans une liste à retourner.

Quelqu'un aurait une solution?

Lien vers le commentaire
Partager sur d’autres sites

Donc quand j'ajoute un élément à mon ArrayList, tout les autres éléments prennent la valeur du dernier.

C'est logique puisque ton objet "actualObject" est déclaré static donc c'est une instance de classe donc unique pour ta classe.

Quelqu'un aurait une solution?

En enlevant static ça devrait fonctionner.

MonObject actualObject = new MonObject();

Lien vers le commentaire
Partager sur d’autres sites

public ArrayList<MonObject> getXMLResult(){
               mObjectList = new ArrayList<MonObject>();
               try {
           // creates and returns new instance of SAX-implementation:
           SAXParserFactory factory = SAXParserFactory.newInstance();

           // create SAX-parser...
           SAXParser parser = factory.newSAXParser();
           // .. define our handler:
           MonHandler handler = new MonHandler();

           // and parse:
           parser.parse("file:///sdcard/fichierxml.xml", handler);

       } catch (Exception ex) {
           ex.printStackTrace(System.out);
       }
       return mObjectList;
       }
private final class MonHandler extends DefaultHandler {
               private String lastElement = "null";
               MonObject actualObject = new MonObject();

               // invoked when document-parsing is started:
               public void startDocument() throws SAXException {
                   System.out.println("Document processing started");

               }

               // notifies about finish of parsing:
               public void endDocument() throws SAXException {
                   for(int i = 0; i<mObjectList.size();i++){
                       MonObject focusedObject = mObjectList.get(i);
                       System.out.println(focusedObject.getName());
                   }
                   System.out.println("Document processing finished");
               }

               // we enter to element 'qName':
               public void startElement(String uri, String localName, 
                       String qName, Attributes attrs) throws SAXException {
                   if (qName.equals("maintag")) {

                   } else if (qName.equals("MonObject")) {
                       actualObject = new MonObject();
                       actualObject.setName(attrs.getValue("name"));
                       mObjectList.add(new MonObject(actualObject));
                   /* if (...)
                               } */ else {
                       throw new IllegalArgumentException("Element '" + 
                               qName + "' is not allowed here");
                               }
                   setLastElement(qName);
               }

               // we leave element 'qName' without any actions:
               public void endElement(String uri, String localName, String qName)
               throws SAXException {
                   // do nothing;
               }

                       public void setLastElement(String lastElement) {
                               this.lastElement = lastElement;
                       }

                       public String getLastElement() {
                               return lastElement;
                       }
           }

Merci mais le problème est toujours présent, j'ai enlevé le static dans la déclaration de actualObject, j'ai même testé en l'enlevant dans la déclaration de la class du handler, et pour éviter un problème de passage par référence j'ai créer dans la classe MonObject un constructeur qui va copier les variables "new MonObject(actualObject);"

Là je ne trouve vraiment pas le problème

Lien vers le commentaire
Partager sur d’autres sites

Archivé

Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.

×
×
  • Créer...