Methode genau einmal aufrufen?

  • 10 Antworten
  • Letztes Antwortdatum
M

minni.maus

Neues Mitglied
0
Hallo liebes Forum,

ich habe ein Problem bei der Entwicklung einer Android-App.
Ich habe eine ListView und befülle diese mit Bildern die in einer xml-Datei gespeichert sind.
Ich möchte, dass die ListView beim ersten Klick auf den Tab (habe einen Tab um ein Bild auszuwählen) befüllt wird.
Soweit so gut.
Wenn der User aber nochmal auf den Tab klickt, werden alle Daten ein zweites Mal geladen - das will ich natürlich nicht.

Die Methode, die die ListView mit den Daten befüllt, soll nur ein einziges Mal aufgerufen werden. Bei meiner Suche im Internet kam ich auf folgende Lösung: Über die Shared Preferences einen boolean Wert setzen, damit die Methode nur einmal aufgerufen wird.
Habe ich auch probiert, allerdings wird dann beim zweiten Klick auf den Tab gar nichts mehr angezeigt.

Ich sitze nun scohn 4 Stunden und bin noch auf keine Lösung gekommen - wäre toll, wenn ihr mir helfen könnt. LG!

Anbei meine onCreate Methode.
Code:
public void onCreate(Bundle savedInstanceState) 
{
           super.onCreate(savedInstanceState);
	setContentView(R.layout.show_model);
		
	listView = (ListView) findViewById(R.id.lv_show_model);
	
	SharedPreferences myPreferences = PreferenceManager.getDefaultSharedPreferences(this);
		boolean isFirstRun = myPreferences.getBoolean("FIRSTRUN", true);
	if (isFirstRun)
	{
               createModels();
	    SharedPreferences.Editor editor = myPreferences.edit();
	    editor.putBoolean("FIRSTRUN", false);
	     editor.commit();
	}
		
	SimpleAdapter mSchedule = new SimpleAdapter (this.getBaseContext(), 
        	listItem, R.layout.show_model,
               new String[] {"img", "title"}, 
                new int[] {R.id.img, R.id.title});

       listView.setAdapter(mSchedule);
       listView.setClickable(true);
       listView.setOnItemClickListener(pointClickListener);	
		
}

public void createModels()
{
	for(int i=0; i < WorldHandler.getSpheres().size(); i++)
	{	
	        map = new HashMap<String, String>();
	        map.put("title", WorldHandler.getSphere(i).getSname());
	        map.put("img", String.valueOf(R.drawable.map_server2));    		        
	        listItem.add(map);
	}
}
 
Warum soll die nur einmal aufgerufen werden?
Das kann nicht funktionieren, da du in der OnCreate Methode bist die wird nur aufgerufen wenn deine Activity komplett neu aufgebaut wird.

Wenn du das also speicherst wird das nur ein einziges mal überhaupt aufgerufen, und wenn du ne Woche später wieder die App öffnest nicht.
Es wird also aktuell nie wieder die listView gefüllt.

Deswegen kannst du auch nix sehen.

Guck dir mal den Activity Lifecycle an:
Activity | Android Developers

Evtl wäre dein Bilderladen in einer anderen Methode sinnvoller.

Wobei eigentlich dürfte die Methode sowieso nur einmal aufgerufen werden, nämlich dann wenn du die Activity aufrufst.

Ansonste verrat uns warum die nur einmal aufgerufen werden soll, momentan seh ich da kein grund für.
 
Hallo amfa,

danke schonmal für deine Hilfe!

Das Problem ist, dass jedesmal wenn neu auf den Tab geklickt wird, werden die Bilddateien nocheinmal unten drangehängt.

Beispiel:
Ich habe zwei Bilder.
Rufe ich das erste Mal den Tab "Bilder wählen" auf, sehe ich die 2 Bilder in der Listview.
Rufe ich das zweite Mal den Tab "Bilder wählen" auf, kommen schon 4 Bilder, weil die 2 wieder unten dran gehängt werden.

Deshalb habe ich gedacht, dass ich die Methode nur einmal aufrufe, damit das Problem gelöst ist.

Oder kann ich die ListView am Anfang der Methode einfach leeren? Dann hätte ich auch kein Problem mehr. Ist das möglich?

Danke für den ActivityLifecycle, nun verstehe ich, warum gar nichts mehr angezeigt wird.

LG!
 
du kannst zum einen den adapter leeren. sowas wie .clear() gibts wahrscheinlich.

zum anderen kannst du checken ob der adapter schon befüllt wurde, dann einfach nichts mehr anhängen.

der code, bei dem deine daten geladen werden ist irgendwie nicht reinkopiert.
 
Ok danke, das mit dem leeren des Adapters werde ich probieren.

Wie checkt man denn ob der Adapter schon befüllt wurde? Gibt es da einen eigenen Befehl? Oder kann man zählen, ob im Adapter schon Elemente sind? Komme erst heute Abend zum Programmieren, werde ich auf alle Fälle probieren!

Meine Daten werden in der for-Schleife der createModels() geladen.
WorldHandler.getSpheres().size() --> da wird über getSpheres die Größe des Datensatzes ermittelt.
Bei map.put("title", WorldHandler.getSphere(i).getSname()); werden sie dann in die ListView geschrieben...
Hat bis jetzt so funktioniert :)
 
Trotzdem versteh ich nicht wieso das zweimal befüllt wird.
Müsste die Listview nicht auch zerstört werden, wenn die Activity zerstört wird?
Vorher dürfte er doch gar nicht wieder in die onCreate Methode kommen.

Oder hab ich nen Knoten im Hirn? :D
 
Du kannst dir eine Seperate Klasse erstellen mit einer Hilfsvariable !
z.B. Klasse Constants

Dann dort:

public static int METHODEN_AUFRUF =0;

bei der Methode machst du dann folgendes

if(Constants.METHODEN_AUFRUF ==0){

Deine Methode!

Constants.METHODEN_AUFRUF=1;
}

Dann ruft er es nur einmal auf!
 
Hallo und danke für eure Antworten!

Das Problem besteht leider immer noch - wenn ich die Methode nur einmal aufrufe, wird beim zweiten Mal klicken die ListView nicht mehr befüllt.
Wird das Befüllen der ListView im onCreate gelassen, werden die Einträge zur aktuellen ListView immer dazugehängt.
Ich habe schon versucht, die ListView am Anfang zu leeren, allerdings funktioniert das auch nicht. listView.setAdapter(null); SimpleAdapter mSchedule = null;

Hat noch jemand eine Idee?

Code:
public void onCreate(Bundle savedInstanceState) 
{
	super.onCreate(savedInstanceState);
	setContentView(R.layout.show_model);

	listView = (ListView) findViewById(R.id.lv_show_model);
	listView.setAdapter(null);
	SimpleAdapter mSchedule = null;
		
	for(int i=0; i < WorldHandler.getSpheres().size(); i++)
	{	
	   map = new HashMap<String, String>();
	   map.put("title", WorldHandler.getSphere(i).getSname());
	   map.put("img", String.valueOf(R.drawable.map_server2));    		        
	   listItem.add(map);
		
            mSchedule = new SimpleAdapter (this.getBaseContext(), 
	 listItem, R.layout.show_model,
	 new String[] {"img", "title"}, 
	     new int[] {R.id.img, R.id.title});
	     mSchedule.notifyDataSetChanged();
	     }
		
       listView.setAdapter(mSchedule);
       listView.setClickable(true);
       listView.setOnItemClickListener(pointClickListener);	
}
 
Ok ich hab eine Idee.
Was ist listItem?
Das wird nirgendswo in deinem Codestück definiert.
Es könnte jetzt sein, dass listItem, dass ja scheinbar die Bilder selbst enthält eine Klassenvariable ist.
Die Activity wird irgendwann vom System zerstört (onDestroy wird aufgerufen) aber das Objekt lebt noch weiter.
Beim nächsten Aufruf wird das alte Objekt genommen das immer noch das gleiche listItem Objekt enthält inkl der hinzugefügten bilder.

Ich würde mal im Debugger gucken ob listItem schon die Bilder enthält beim 2. aufruf.
Mir scheint da könnte irgendwo die Lösung sein, sicher bin ich mir aber nicht.
 
Hallo,

das mit ListItem habe ich versucht, hat leider auch nicht geklappt.
In meiner Listview werden alle Einträge immer wieder unten drangehängt.
Ich habe auch schon alles mögliche in der onCreate am Anfang auf null gesetzt, hat leider alles nichts gebracht.
Auch meine Recherche im Internet führte mich zu keiner Lösung...

Fall irgendjemand noch eine Idee hat - bitte gerne ;)

LG!
 
So auf Anhieb fällt mir auch nichts mehr ein.
Ich würde jetzt halt im Debugger alles mal schritt für schritt durchgehen und gucken wann was in die Liste gefüllt wird.

Ich bin eigentlich immer noch der Meinung, wenn die onCreate Methode aufgerufen wird dürfte eigentlich gar nix in der Klasse vorhanden sein.

Sonst musste das komplette Projekt mal hochladen als zip, dann kann ich evtl mal rein gucken.
 
Zurück
Oben Unten