Bei onResume() onCreateView aufrufen

  • 7 Antworten
  • Letztes Antwortdatum
F

Flixius

Fortgeschrittenes Mitglied
4
Hallo liebe Gemeinde,

Ich habe über ActionBarSherlock mit Fragments ein TabLayout. Wenn ich in Tab1 Daten ändere, dann soll sich wenn ich zu Tab2 switche die Datengrundlage der ListView in Tab2 neu geladen werden. Ich habe schon sehr viele Möglichkeiten durchgespielt und bin immer wieder auf Probleme gestoßen. Nun halte ich es für die beste Möglichkeit, wenn in Tab2 onResume() einfach überschrieben wird. Wenn onResume getriggert wird, dann soll einfach onCreateView() aufgerufen werden.

Da onCreateView die Parameter LayoutInflater inflater, ViewGroup container und Bundle savedInstanceState erwartet, weiß ich nicht was ich übergeben soll. Könnt ihr mir da weiterhelfen? Das wäre wirklich formidabel!
 
sehr böse wäre es, wenn du im onresume oncreateview manuell aufrufen würdest. das sind lifecycle methoden und werden vom system aufgerufen. das kann zu sehr komischen dingen führen, die dir viel ärger bereiten.

du sagst ja du willst anhand von einer auswahl im tab 1 - eine liste im tab2 verändern. das hat ja absolut nichts mit oncreateview dann zu tun. oncreateview erzeugt die views, wie der name schon sagt. die listview ist dann ja schon erzeugt.

ich würde einfach entweder den adapter oder den datensatz etwas globaler gestalten und beim der auswahl im tab1 die daten verändern.
im tab2 werden dann in der liste die korrekten daten gezeigt.
 
Hallo swordi. Vielen Dank für deine Antwort!

Iich habe mir schon gedacht, dass es ein ziemlicher Hack wäre, wenn ich es so umsetzen würde.
Derzeit ist es so, dass Tab1 über Sqlite Daten manipuliert, die in der lsv in Tab2 dargestellt werden. Tab2 geht über das Dao und selektiert die Daten aus der Tabelle. Das funktioniert soweit.

onResume scheint das einzige Event zu sein, das zuverlässig geschmissen wird, wenn ich in das Tab 2 wechsel.

Meine Tabhosterklasse hat zwar auch ein Event, das geworfen wird, aber von dort aus kann ich ja nicht auf die ListView zugreifen.

Ich habe versucht es so umzusetzen wie unten im Code, aber bekomme schon beim Start der App eine NullPointerException. Mit dem Debugger komme ich nicht weiter, weil er nicht in den Code reinspringt. Allerdings läuft die App, wenn ich alles was im OnResume ist, auskommentiere. Ich vermute es hängt damit zusammen, dass es dort ein zeitliches Problem gibt und onResume beim initialen Aufbau ein mal geworfen wird obwohl der view noch nicht vollständig existiert oder sowas in der Art.

Hier die wesentlichen Stellen im Code. Ich habe ihn für besere Lesbarkeit ein wenig vereinfacht.

Code:
public class MyTeamActivity extends SherlockFragment {

    Context ctx = null;
    MyAdapter myadapter = null;

    @Override
    public void onResume() {
        if (myadapter != null && !myadapter.isEmpty()) {
        Log.w("resumed!!!", "yes");
            myadapter.clear();
            MyDao dao = new MyDao(ctx);        
            MyObject[] objects = dao.GetObjects();
            pa.addAll(players);
            pa.notifyDataSetChanged();
        }
    }
    

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState)
    {    
        View view = inflater.inflate(R.layout.mylayout, container, false);
        ctx = view.getContext();
        
        MyDao dao = new MyDao(ctx);        
        MyObject[] objects = dao.GetObjects();
        myadapter = new MyAdapter(view.getContext(), de.fliese.R.layout.mycustomrow, objects);
          
        ListView mylsv = (ListView) view.findViewById(R.id.mylsv);
        mylsv.setAdapter(pa);
        return view;
    }
 
naja ohne log ist es reine hellseherei, aber

ich vermute mal, dein myadapter object ist leer. ich würde das myAdapter object bereits in der onCreate initialisieren.
in der onresume kannst dann die daten setzen(notifiydatasetchanged nicht vergessen) und in der oncreateview kannst es der listview anhängen.

damit sollte es da zeitlich keine probleme mehr geben.
 
Hallo swordi!

In der Theorie klingt das ganz gut! Wenn ich beim onCreate() den Adapter schon mal initialisieren möchte, dann muss ich einen context übergeben. Der context wird aber erst beim onCreateView() instanziiert. Mein Context ist daher null und es kommt zur erwarteten NullPointerException.
Irgendwie sehe ich bei diesem Problem echt kein Land.
 
Der context existiert auch vorher schon. Sonst wär es sehr blöd :)

Versuche es mal mit getActivity()

Gesendet von meinem Galaxy Nexus mit der Android-Hilfe.de App
 
  • Danke
Reaktionen: Flixius
Mensch swordi!!! Du bist einfach brilliant. Ernsthaft. Seitdem ich mich App-Entwicklung beschäftige stoße ich im Forum hier immer wieder auf dich. Du kümmerst dich um fast jeden Thread, reagierst nicht - wie einige andere - genervt oder von oben herab, wenn Newbies "dumme" Fragen stellen und bringst einen wirklich weiter. Bei der Entwicklung meiner ersten "professionellen" App stoße ich auf tausend Probleme und meine einzigen Anlaufstellen sind eigentlich Stackoverflow und dieses Forum hier. Da ich nicht so übermäßig gut in englisch bin bleibt mir für kompliziertere Dinge nur dieses Forum, wenn ich durch googlen nicht zum Erfolg komme. Du bist wirklich ein Lichtbick für mich, weil ich sonst teilweise ziemlich verlassen mit meinen Problemen da stehe. Das klingt jetzt alles sehr überschwänglich, ist aber vollkommen ernst gemeint! Wenn du eine Amazon Wunschliste hast oder man dir sonst irgendwie einen Gefallen tun kann, dann schreibe mir doch bitte eine PN. Das mache ich nicht nur weil du mir jetzt gerade geholfen hast, sondern für deine "Arbeit", die du im ganzen Forum leistest.

Abschließend noch eine etwas kätzerische Frage: Gibt es noch andere deutschsprachige Anlaufstellen oder vielleicht einen deutschsprachigen IRC-Channel im Netz? IRC wäre mir eigentlich am liebsten, da ich mir "eigentlich" ganz gut über Google selber helfen kann, aber so Dinge wie ein kleines Code Review o.ä. einfach fehlen. Ich habe den Eindruck einige Sachen sind unsauber gelöst, aber ich weiß nicht wie ich es anders lösen könnte. Ein Forum ist dafür meiner Meinung nach der falsche Ort für solche Dinge. Okay ich bin anscheinend gerade in Schreiblaune und beende jetzt hier.

Also danke noch mal, swordi!
 
danke für die blumen :)

amazon wunschliste hab ich keine, aber ich kann dir gerne meine paypal adresse schicken :D

ich kenne nicht wirklich gute anlaufstellen. deutschsprachig ist es sowieso ganz schwer was zu finden. ich nutze eigentlich nur google - reicht für infos :)
 
Zurück
Oben Unten