Frage von Bayera, 89

Wieso überschreibt meine add() Funktion meine Arraylist?

Ich bekomme es einfach nicht hin.

Ich schreibe eine App mit Android Studios. Ich kann wunderbar neue Objekte zu einer ArrayList hinzufügen, das hat aber zur Folge dass die alten Alle mit dem Selben Objekt ersetzt werden. Ich möchte die alten aber behalten und das "neue" Element einfach nur hinten dran gehangen haben :/

hier mal der Code:

public class FileHandler { private FileHandler(){} //Konstruktor

private ArrayList<BeanUsers> allUser=new ArrayList<>();
private static FileHandler instance=null;
private BeanUsers currentUser=new BeanUsers();

public static synchronized FileHandler getInstance()
{
 if(instance==null){   instance=new FileHandler();}
 return instance;
}


public int addNewUser (BeanUsers neuer)
{           
            this.allUser.add(neuer); //hier soll es eigentlich nur ANGEHANGEN werden
            return this.allUser.indexOf(neuer); //gibt index, des neuen Elementes zurück
}

}

Ich hoffe mir kann jemand helfen

Expertenantwort
von KnusperPudding, Community-Experte für Java, 20

Also da ist kein Fehler. - Demnach wäre interessant zu wissen, wie du darauf kommst, dass es einen Fehler geben könnte?

Ich hab mal ein Bean 'erraten' und kann das nicht nachvollziehen:

http://pastebin.com/Na1K8AGC

kannst du bitte etwas konkreter werden?

Antwort
von triopasi, 64

Da sehe ich keinen Fehler, vllt liegt der ja ganz wo anderst?  Vllt liegts daran, dass du immer dasselbe Objekt bearbeitest (Objekte sind in Java Referenzvariablen!)

Kommentar von Bayera ,

Ich habe es auch schon so probiert, was das dann doch ausschließen sollte:

public int addNewUser (BeanUsers neuer)
{
BeanUsers Temp=new BeanUsers();
Temp=neuer;
this.allUser.add(Temp);
return this.allUser.indexOf(neuer);
}
Kommentar von triopasi ,

Nein, ich glaube damit ist Temp eine Referenz auf neuer. Probiere mal 

BeanUser tmp = new BeanUser(neuer);

PS: Code Conventions von Java anschauen! Klassennamen immer im Singular und Variablen beginnen mit Kleinbuchstaben!!

Kommentar von MalNachgedacht ,
public int addNewUser (BeanUsers neuer)
{
BeanUsers Temp=new BeanUsers();
Temp=neuer;
this.allUser.add(Temp);
return this.allUser.indexOf(neuer);
}

Fast richtig - aber trotzdem falsch:

Du erstellst zwar jedesmal ein neues BeanUsers() Objekt und speicherst es in Temp - aber danach ist alles für die Katz weil Du Temp ja wieder das Objekt in neuer zuweist,

Stattdessen solltest Du ein neues BeanUsers Objekt dort erstellen wo addNewUser() aufgerufen wird....

Kommentar von Bayera ,

Habe ich ja vorher quasi gemacht:

BeanUsers zuSpeichernderUser = new BeanUsers();
zuSpeichernderUser.setBenutzername(txtUserName.getText().toString());
zuSpeichernderUser.setFortschritt("hier steht der Fortschritt");

int i=FileHandler.getInstance().addNewUser(zuSpeichernderUser);
Kommentar von MalNachgedacht ,

sieht richtig aus - bist Du sicher, dass der Fehler nicht der Routine ist mit der Du BeanUsers in allUser ausgibst/weiterverarbeitest. Eventuell greifst Du ja dort irrtümlich immer auf das gleiche Element von allUser und glaubst deswegen das alle Elemente gleich wären - obwohl sie das in Wahrheit gar nicht sind?

Kommentar von Bayera ,

hab ich auch schon ausgeschlossen, da ich es mit ner zusätzlichen Textzeile einfach ausgegeben habe und zusätzlich mit dem Debugger geschaut habe. dort erstellt er auch neue Objekte mit unterschiedlichen Addressen aber trotzdem überschreibt das Programm die Inhalte.

und von Hand habe ich ausprobiert die Liste von Hand zu machen und das klappt auch einwandfrei. deswegen wundert mich das halt tierisch, warum der das nicht bei dieser FUnktion  so macht.

Kommentar von MalNachgedacht ,

zeig mal den Code deiner BeanUsers Klasse

hat die STATIC Variable oder STATIC Methoden?

Antwort
von EightSix, 60

Sicher dass du vor der Übergabe auch tatsächlich ein neues Objekt erstellst?

Die Anzahl der Items in der Liste müsste sich ja erhöhen? Wenn aber alle die selben Werte haben machst du bei der Instantiierung was falsch.

Kommentar von Bayera ,

Die Übergabe erfolgt so:

BeanUsers zuSpeichernderUser = new BeanUsers();
zuSpeichernderUser.setBenutzername(txtUserName.getText().toString());
zuSpeichernderUser.setFortschritt("hier steht der Fortschritt");

int i=FileHandler.getInstance().addNewUser(zuSpeichernderUser);
Antwort
von MalNachgedacht, 39

das Problem dürfte sein, dass Du an der Stelle wo addNewUser() aufgerufen wird nicht jedesmal einen neuen mit new() erstellten BeanUsers übergibts....sondern immer wieder das gleiche Objekt mit geänderten Attributen,,,

Kommentar von Bayera ,

Ich dachte, dass das new ein neues Objekt erstellt?!

Keine passende Antwort gefunden?

Fragen Sie die Community