Android ArrayList <-> ArrayAdapter <-> ListView

Holger_Hessling

Aktives Mitglied
Hallo,

in einer eigenen Beispiel-App habe ich ein Verhalten, das ich mir nicht erklären kann. Kann bitte einer von Euch Licht ins Dunkel bringen?

Zwei Aktivities. Die MainActivity hält eine statische ArrayList, deren Inhalt sie über eine ListView darstellt. Die zweite Activity erzeugt einen neuen Eintrag in der statischen ArrayList.

Aus der zweiten Activity komme ich über zwei Möglichkeiten zurück zur MainActivity. Einmal über den Zurück-Pfeil aus der AppBar und einmal über den Zurück-Button des Handys.

Beim Weg zurück über den Button des Handys verändert sich die ListView nicht. Der neu erzeugte Eintrag erscheint nicht.

Beim Weg zurück über den Pfeil der AppBar wird offensichtlich der ArrayAdapter bemüht, wodurch der neue Eintrag erscheint. (Auch zuvor nicht dargestellte, neue Einträge sind jetzt zu sehen.)

Beim Weg zurück über den Zurück-Button des Handys wird der ArrayAdapter offenbar nicht bemüht. Hier hilft in onResume() der Aufruf von notifyDataSetChanged() des ArrayAdapters.

Meine Frage ist nun, warum wird der Adapter einmal bemüht und einmal nicht?

Gruß
Holger
 
Hi Florian,

nein, das habe ich nicht. Da muß ich mal drüber nachdenken, warum ich das nicht(!) mache :-D Liegt ja eigentlich auf der Hand, daß man eine Activity mit finish() beendet, oder nicht, oder doch, oder oder oder

Oh je, da hast Du mich ja auf eine große Verständnislücke aufmerksam gemacht :-D

Gruß
Holger
 
Hallo,

habe gestern mal die lifecycles mitgeschrieben. Hab zweimal die ChildActivity über einen Button in der MainActivity gestartet und und dann einmal per AppBar und einmal per BackButton beendet. Über mein gesamtes "Konzept" hab ich auch nachgedacht und werde die ganze Sache eh anders lösen.

Aber ein Punkt verstehe ich ganz un gar nicht. Warum gelangt im Fall 'Back Button an AppBar' die MainActivity in den Destroy cycle? Würde mich riesig über Erklärungen freuen!

Danke, Gruß
Holger


Start MainActivity:

Main onCreate()
Main onStart()
Main onResume()

Intent to start ChildActivity:

Main onPause()
Child onCreate()
Child onStart()
Child onResume()
Main onStop()

Back Button on AppBar: (no finish() at ChildActivity)

Child onPause()
Main onDestroy()
Main onCreate()
Main onStart()
Main onResume()
Child onStop()
Child onDestroy()

Intent to start ChildActivity:

Main onPause()
Child onCreate()
Child onStart()
Child onResume()
Main onStop()

Back Button on mobile: (no finish() at ChildActivity)

Child onPause()
Main onRestart()
Main onStart()
Main onResume()
Child onStop()
Child onDestroy()
 
So, hab's gelöst bekommen. In der ChildActivity fange ich den BackButton und den HomeButton (das ist der Zurück-Button der AppBar) ab und rufe einfach finish(); auf. Dann wird in jedem Fall der Back Stack zurück gegangen. Und dabei wird die MainActivity wieder gestartet und eben nicht zuvor zerstört.

Danke an Euch Helfenden!!!!

Code:
@Override
public boolean onOptionsItemSelected(MenuItem item) {

    switch (item.getItemId()) {
        case android.R.id.home:
            finish();
            return true;
    }
    return super.onOptionsItemSelected(item);
}

@Override
public void onBackPressed() {
    finish();
}
 
Navigation up und back sind zwei verschiedene Dinge, haben auch unterschiedliche Auswirkungen. Ob hier immer finish() auzurufen richtig ist, hängt von deinem UseCase ab.
 
Ich verstehe was Du mir sagen willst. In meinem Verständnis von der Funktion meiner geplanten App, soll in diesem Fall immer zu meiner MainActivity zurück gegangen werden.

Mag sein, daß mit wachsendem Verständnis über die Funktionsweise des Android Systems meine jetzige Lösung wieder geändert wird. Bis hierher bin ich mal zufrieden und kann mit meiner App weiter machen.

Danke, Gruß
Holger
 

Zurück
Oben