Objektübergabe an eine andere View

  • Hallo,


    fogendes Problem steht zur Debatte:


    Ich habe eine ListView, bei einem Klick auf eine Element soll eine neue View geöffnet werden (das funktioniert). Es soll das Objekt des angeklickten Items an die neue View übergeben werden und dort weiter verarbeitet werden. Das Objekt wurde aus einer eigenen Klasse erzeugt, und speichert diverse Daten wie email, Name, etc. Das Objekt enthält mehr daten als in der Liste angezeigt werden. Diese sollen in der DetailView angezeigt werden.


    Wie bekomme ich dieses Objekt mit in die neue Activity / View?

  • Kurz: gar nicht.
    Übergib eine Referenz, beispielsweise die _id in der SQLite Datenbank, die die Infos gespeichert hat.


    Lang:
    Da Java es nicht hinbekommt, irgendetwas 'by reference' aufzurufen, kannst Du auch keine Referenzen auf Objekte übergeben.
    Du könntest natürlich Deine Klasse so bauen, dass sie Parcable oder Serializable unterstützt und das Objekt dann als Extra übergeben.
    Nur wird vor der Übergabe die Klasse serialisiert/gepackt und nach der Übergabe ein neues Objekt erstellt, dass die gepackten Inhalte übernimmt.
    Du hantierst an dem Punkt also so oder so mit zwei völlig unterschiedlichen Objekten herum und solltest dementsprechend gleich in jedem geänderten View die Objekte aus den Datenbankinhalten selbst zusammen zimmern.

    Je mehr Käse, desto mehr Löcher.
    Je mehr Löcher, desto weniger Käse.
    Daraus folgt: je mehr Käse, desto weniger Käse.


    »Dies ist ein Forum. Schreibt Eure Fragen in das Forum, nicht per PN!«

  • Die Daten kommen nicht aus einer Datenbank sondern aus einer ListView. Die ListView bezieht ihre Daten aus Objekten welche aus einer XML-Datei erstellt werden.


    Wäre es möglich mit einem eigenen Adapter zu arbeiten und dem Adapter die ArrayList zu übergeben?

  • Call By Reference ist nicht möglich.


    Ob Du jetzt zwei mal dasselbe Objekt rüberkopierst oder zwei mal die Inhalte der ArrayList ist im ersten Moment kein Unterschied.
    (Im Zweiten schon, da Du statt einer mehrere Objektkopien hast)


    Wenn Du aber absolut nicht persistieren willst solltest Du Dir Parcelable oder Serializable ansehen.
    http://developer.android.com/r…ndroid/os/Parcelable.html
    http://developer.android.com/r…java/io/Serializable.html

    Je mehr Käse, desto mehr Löcher.
    Je mehr Löcher, desto weniger Käse.
    Daraus folgt: je mehr Käse, desto weniger Käse.


    »Dies ist ein Forum. Schreibt Eure Fragen in das Forum, nicht per PN!«

  • in der ersten Activity habe ich im onClick-Event folgenden Code:

    Code
    final ArrayList<BizDriveNotification> detailedNnote = notes //;
    			 Bundle selcetedItemObject = new Bundle();
    			 selcetedItemObject.putSerializable("selectedItem", detailedNnote);
    			 intent.putExtras(selcetedItemObject);


    in der DetailView Activity den folgenden:

    Code
    Intent intent = this.getIntent();
        	Bundle bundle=intent.getExtras();
        	ArrayList<BizDriveNotification> detailedNnote = (ArrayList<BizDriveNotification>)bundle.getSerializable("selectedItem");


    kann aber nicht auf den Inhalt des Objektes zugreifen. Warum?


    Ich frage mich, ob ich nicht den unschönen Weg gehen soll (kann) und SharedPreferences verwenden soll.

  • Keine Ahnung wieso. Frag so etwas doch den Debugger, der kann Dir das sicherlich sagen.
    Vermutlich können Deine Objekte kein Serializable, so dass zwar das Array eingetütet wird, Deine Objekte hingegen aber nicht.


    Nein, Du sollst nicht den Weg über SharedPreferences gehen. Entweder Du willst Deine Objekte ausschließlich zur Laufzeit im RAM haben (was ich nicht nachvollziehen kann), dann implementier das Serializable/Parcable korrekt. Oder Du willst Deine Objekte persistieren. Dann nutze SQLite oder irgend einen ORM Manager, der Dir den Kram abnimmt.

    Je mehr Käse, desto mehr Löcher.
    Je mehr Löcher, desto weniger Käse.
    Daraus folgt: je mehr Käse, desto weniger Käse.


    »Dies ist ein Forum. Schreibt Eure Fragen in das Forum, nicht per PN!«

  • keine Persistenz erforderlich. die Daten sind da, liegen in Objekten. Ein Teil wird angezeigt in der ListView. Bei Click auf eine Item soll eine new View aufgehen und den Ganzen Inhalt anzeigen, wie bei SMS oder Mail.

  • Wenn keine Persistenz erforderlich ist, dann lass die Finger von den SharedPreferences. Zumal diese sowieso nur Voreinstellungen persistieren sollen.
    Davon abgesehen kannst Du Deine eigenen Objekte eh nicht in die SharedPreferences stopfen.


    SMS oder Mail persistieren ihre Inhalte, weshalb das dort wesentlich einfacher umsetzbar ist.
    Was ist denn nun bei Deiner Serializable Implementierung kaputt?

    Je mehr Käse, desto mehr Löcher.
    Je mehr Löcher, desto weniger Käse.
    Daraus folgt: je mehr Käse, desto weniger Käse.


    »Dies ist ein Forum. Schreibt Eure Fragen in das Forum, nicht per PN!«

  • Dein Objekt ist leer, weil Du eine ArrayList (serializable) übergibst, die Objekte (non-serializable) enthält.
    Insofern wird Deine ArrayList korrekt übergeben (was übrigens Blödsinn ist, da Du ja nur ein einziges Objekt übergeben möchtest), bei den darunter befindlichen Objekten schlägt die Serialisierung fehl und das Array ist folgerichtig leer.


    Da Du auf meine Frage keinen Sourcecode gepostet hast, nehme ich mir heraus meine Frage selbst zu beantworten:
    Du hast Parcable/Serializable nicht verstanden und einfach ein Objekt übergeben, dass eines dieser Systeme von Haus aus unterstützt.
    Deine eigenen Objekte haben keinerlei Serializable/Parcable Implementierung.

    Je mehr Käse, desto mehr Löcher.
    Je mehr Löcher, desto weniger Käse.
    Daraus folgt: je mehr Käse, desto weniger Käse.


    »Dies ist ein Forum. Schreibt Eure Fragen in das Forum, nicht per PN!«

  • sorry für den fehlenden Code.
    Meine Klasse von der sich das Objekt ableitet implementiert Serializable.


    Und Verzeihung für die dämlichen Fragen.

  • Es gibt keine dämlichen Fragen.
    Lediglich faule Fragen und wenig hilfreiche Fragen.


    Dann zeig doch mal Deine Implementierung her.
    Die writeObject(Stream) und readObject(Stream) sollten reichen.

    Je mehr Käse, desto mehr Löcher.
    Je mehr Löcher, desto weniger Käse.
    Daraus folgt: je mehr Käse, desto weniger Käse.


    »Dies ist ein Forum. Schreibt Eure Fragen in das Forum, nicht per PN!«

  • Also ich habe meine Klasse von welcher das Objekt erzeugt habe Serializable implementieren lassen.
    Danach habe ich im onClick Event folgenden Code implementiert:

    Code
    Bundle selcetedItemObject = new Bundle();
    			 selcetedItemObject.putSerializable("selectedItem", notes.get(position));
    			 intent.putExtras(selcetedItemObject);


    hiermit konnte ich das gewünschte Objekt übertragen und in der neuen Activity weiter verarbeiten. Ausgelesen habe ich das Bundel in der neuen Activity wie folgt:


    Code
    Intent intent = this.getIntent();
    Bundle bundle = intent.getExtras();
    @SuppressWarnings("unchecked")
    MyClass detailedNnote = (MyClass)bundle.getSerializable("selectedItem");
  • Sehr gut.
    Gegebenenfalls noch mal die Existenz der Extras prüfen, nicht dass Du später aus Versehen von woanders dasselbe View öffnest und Dir dann alles aabschmiert. :)

    Je mehr Käse, desto mehr Löcher.
    Je mehr Löcher, desto weniger Käse.
    Daraus folgt: je mehr Käse, desto weniger Käse.


    »Dies ist ein Forum. Schreibt Eure Fragen in das Forum, nicht per PN!«

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!