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
4 Antworten
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,,,
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.
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);
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!)
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....
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);
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?
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.
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:
kannst du bitte etwas konkreter werden?
Ich habe es auch schon so probiert, was das dann doch ausschließen sollte: