Fragment vergißt die Inhalte der "alten" Arraylist der MainActivity

  • Antworten:7
Frank Rudolf
  • Forum-Beiträge: 215

10.02.2016, 11:15:26 via Website

Ich habe in der MainActivity eine ArrayList, der ich in einem Fragment neue Werte hinzufügen möchte:

 MainActivity mainActivity = new MainActivity();
 mainActivity.textFile.add(new Info(iD,info,father));

Im Debugger kann ich aber wahrnehmen, dass die "alte" Arraylist textFile gar nicht mehr berücksichtigt wird. Beim Adden wird einfach wieder mit dem Index 0 begonnen. Alle bisher eingegebenen Werte werden ignoriert. mainActivity.textFile hat nun die Größe 1 und es findet sich auch nur der gerade geaddete Wert wieder, also nur der Index 0.

Nach der Rückkehr in die MainActivity greift das Programm wieder auf die alte Arraylist zurück. Und so finde ich auch wieder alle alten Einträge mit einer Size der Arraylist von zB 15 oder 100. Aber der im Fragment neu hinzugefügte Wert findet sich nicht.

Antworten
Gelöschter Account
  • Forum-Beiträge: 2.492

10.02.2016, 11:18:17 via Website

Ich weiß nicht wie der Code oben im gesamten Kontext steht, aber so erstellst du ja eine neue Acitvity und die hat schließlich wieder eine neue textFile Liste. Entweder machst du die Liste static, dann ist sie über alle Instanzen hinweg gültig (ob das in deinem Zusammenhang ohne Probleme geht weiß ich nicht), oder du holst dir im Fragment die aufrufende Activity und greifst dann über diese Instanz auf die Liste zu, was ich schöner finde ;)

— geändert am 10.02.2016, 11:34:31

Frank Rudolf

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

10.02.2016, 11:18:34 via Website

Das liegt ganz einfach daran, dass du die MainActivity neu Instanziierst und damit auch eine neue ArrayList erstellst.
Wenn du diese haben willst bracuhst du einen ObjektVerweis entweder auf die Liste selber oder auf die MainActivity.

Du hast doch schon so viele Anläuft gehabt, immer noch nicht hinbekommen?
Vielleicht beschreibst du mal etwas mehr was es nachher werden soll, dann kann man besser helfen.

LG Pascal //It's not a bug, it's a feature. :) ;)

Frank Rudolf

Antworten
Frank Rudolf
  • Forum-Beiträge: 215

10.02.2016, 11:36:17 via Website

Ja, ich hatte wohl einen Denkfehler. Ich erstelle in der Tat mit meinen oben genannten Zeilen eine neue MainActivity.

Aber wie kann ich mich auf die bestehende Arraylist beziehen? Das können doch nur höchstens drei oder vier Zeilen sein, oder?

Antworten
Rafael K.
  • Forum-Beiträge: 2.359

10.02.2016, 11:37:56 via Website

Vor allem fehlt da einfach ein bisschen Grundwissen in Sachen Objektorientierte Programmierung und auch Lifecycle in der Android Plattform. Damit würde sich die Frage selbst beantworten :-)

Man erzeugt in Android NIE eine neue Instanz einer Activity selbst. Das macht alles komplett das Betriebssystem.
Man sagt dem Betriebssystem nur über die Methode startActivity(Intent) welche Activity man starten möchte.

Übergabe von Daten an eine andere Activity/Fragment geht auch sehr strukturiert. Wie schon gesagt wurde kann man von einem Fragment aus über getActivity() eine Referenz auf die Activity bekommen, der das aktuelle Fragment gehört.
Braucht man nur den Wert und keine Referenz, kann man einem Fragment auch über setArguments(Bundle) Start-Parameter mitgeben.

Frank Rudolf

Antworten
Gelöschter Account
  • Forum-Beiträge: 2.492

10.02.2016, 11:41:02 via Website

Ich denke am schönsten ist es in der onAttach - Methode im Fragment (Achtung: Überschreiben!) sich die Activity zu nehmen (liegt je nach API als Context oder Activity vor) und dann damit auf die Liste zuzugreifen, das müsste gehen. Habe das bisher nur mit Methoden gemacht, aber auf Variablen sollte man damit ja auch zugreifen können.

Frank Rudolf

Antworten
Frank Rudolf
  • Forum-Beiträge: 215

10.02.2016, 11:57:37 via Website

Danke, da waren ein paar gute Tipps dabei! ZB der Hinweis auf GetActivity.

Ich habe mir eine etwas sauberere GesamtArchitektur des Programms überlegt. Dabei kann ich die einzelne Frage dieses Threads wahrscheinlich umgehen. Aber Dank Eurer Tipps würde es jetzt vielleicht auch gehen.

Ich werde als nächstes über meinen "InterfaceListener" ein Update versuchen. Dieses Update soll immer dann durchgeführt werden, wenn ich per Fragment (es wird noch zwei, drei weitere ähnliche geben) eine Änderung am zugrundeliegenden Datenbestand (Textdatei) durchführe (also Neu, Ändern, Löschen etc.).

Ganz schlecht von Pascal ist die Idee, das Gesamtprojekt etwas vorzustellen, auch nicht. Aber ich möchte Eure Hilfe auch nicht zu sehr strapazieren ;).

Den kürzlich (von Henrik?) gemachten Tipp, die Methoden im Sinne der allgemeinen Konventionen mit Kleinbuchstaben zu beginnen, werde ich wohl auch umsetzen (geht ja mit Refactoring relativ schnell und sicher).

— geändert am 10.02.2016, 11:58:47

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

10.02.2016, 12:08:34 via Website

Hilfe strapazieren tust du nicht ;)
Dafür ist ein Forum doch da.
Außerdem, wer nicht helfen möchte, schreibt auch nichts, damit ist das dann erledigt

LG Pascal //It's not a bug, it's a feature. :) ;)

Frank Rudolf

Antworten