1. Nimm jetzt an unserem 2. ADVENT-Gewinnspiel teil - Alle Informationen findest Du hier!

intent.putxtra -> LinkedList

Dieses Thema im Forum "Android App Entwicklung" wurde erstellt von emanuell, 04.10.2010.

  1. emanuell, 04.10.2010 #1
    emanuell

    emanuell Threadstarter Neuer Benutzer

    Beiträge:
    13
    Erhaltene Danke:
    0
    Registriert seit:
    04.10.2010
    Hallo zusammen

    Wie übergebe ich zwischen zwei Views ein LinkedList. Mit put Extra kann ich ja z.B. Strings und integers übergeben kann ich auch eine Variable vom Typ linked List übergeben ?? Getter und Setter funktionieren nicht, die werte werden alle wieder auf null gesezt wenn ich startActivity(intent) ausführe.

    Wie kann ich das Problem lösen ?
    :mellow:

    Gruss
     
  2. swordi, 04.10.2010 #2
    swordi

    swordi Gewerbliches Mitglied

    Beiträge:
    3,389
    Erhaltene Danke:
    441
    Registriert seit:
    09.05.2009
    also was ich sicher weiß, ist dass man arraylists übergeben kann, die parcelable sind.

    linkedlist dürfte nicht so viel anders sein

    parcelable ist halt das stichwort
     
  3. the_alien, 04.10.2010 #3
    the_alien

    the_alien Android-Lexikon

    Beiträge:
    1,559
    Erhaltene Danke:
    184
    Registriert seit:
    04.05.2009
    Vorallem die Objekte die drin sind müssen Parceable sein!
     
  4. emanuell, 04.10.2010 #4
    emanuell

    emanuell Threadstarter Neuer Benutzer

    Beiträge:
    13
    Erhaltene Danke:
    0
    Registriert seit:
    04.10.2010
    Hallo

    Ich habe ein Beispiel gefunden. Wie passe ich das für ein LinkedList an.

    Mein Code ParcelTest.java
    Code:
    package second.Project;
    import java.util.HashMap;
    import java.util.LinkedList;
    import android.os.Parcel;
    import android.os.Parcelable;
    public class ParcelTest implements Parcelable
    {
     private LinkedList<Poi> poi;
     public ParcelTest(LinkedList<Poi> tmppoi) {
      this.poi = tmppoi;
     }
     public ParcelTest(Parcel in) 
     {
      String[] data = new String[3];
      in.readStringArray(data);
      this.id = data[0];
      this.name = data[1];
      this.grade = data[2];
     }
     @Override
     public int describeContents() 
     {
      return 0;
     }
     @Override
     public void writeToParcel(Parcel dest, int flags) 
     {
      dest.writeStringArray(new String[] { this.id, this.name, this.grade });
     }
     public static final Parcelable.Creator CREATOR = new Parcelable.Creator() 
     {
      public ParcelTest createFromParcel(Parcel in) 
      {
       return new ParcelTest(in);
      }
      public ParcelTest[] newArray(int size) 
      {
       return new ParcelTest[size];
      }
     };
    }
    
    
    Activity1.java
    Code:
    intent.putExtra("myLinkedList", linkList);
    
    Activity2.java
    Code:
    Bundle data = getIntent().getExtras();
    ParcelTest test= data.getParcelable("myLinkedList");
    
    please help :unsure:
     
  5. the_alien, 04.10.2010 #5
    the_alien

    the_alien Android-Lexikon

    Beiträge:
    1,559
    Erhaltene Danke:
    184
    Registriert seit:
    04.05.2009
    Die LinkedList implementiert Serializable. Von daher geht sie sowieso. Problem dürften nur deine Objekte sein. Die müssen Serializable oder Parceable sein, sonst gehts nicht.
     
  6. emanuell, 04.10.2010 #6
    emanuell

    emanuell Threadstarter Neuer Benutzer

    Beiträge:
    13
    Erhaltene Danke:
    0
    Registriert seit:
    04.10.2010
    versteh dich nicht. Was meinst du genau damit. So einfach wie ein String kann ich die LinkedList nicht übergeben.
     
  7. the_alien, 04.10.2010 #7
    the_alien

    the_alien Android-Lexikon

    Beiträge:
    1,559
    Erhaltene Danke:
    184
    Registriert seit:
    04.05.2009
    Also entweder kann man die LinkedList als Serializable Extra hinzufügen oder man wandelt die LinkedList in eine ArrayList um und die kann man über putParcelableArrayListExtra() an das Intent übergeben.
     
  8. swordi, 04.10.2010 #8
    swordi

    swordi Gewerbliches Mitglied

    Beiträge:
    3,389
    Erhaltene Danke:
    441
    Registriert seit:
    09.05.2009
    guck dir an was serializable oder parcelable sind, dann weißt du auch was hier gemeint ist
     
  9. emanuell, 05.10.2010 #9
    emanuell

    emanuell Threadstarter Neuer Benutzer

    Beiträge:
    13
    Erhaltene Danke:
    0
    Registriert seit:
    04.10.2010
    Ich hab mir das schon angeschaut. Wenn ich eine ArrayList verwende muss ich die Daten über eine Klass die parcelable implementiert. Was ist der Sinn dahinter. Ich übergebe eine ArrayList und erhalte eine ArrayList. Wieso brauchts diesen Weg überhaupt. Theoretisch überflüssig oder nicht ?

    ArrayList<Poi> arrList = new ArrayList<Poi>;
    ......
    ......

    mit
    Code:
    intent.putParcelableArrayListExtra("meineListe", arrList);
    und mit folgendem Code auslesen:
    Code:
    getParcelableArrayList
     
  10. the_alien, 05.10.2010 #10
    the_alien

    the_alien Android-Lexikon

    Beiträge:
    1,559
    Erhaltene Danke:
    184
    Registriert seit:
    04.05.2009
    Deine Objekte müssen komplett serialisierbar sein, weil ein Intent auch über Prozessgrenzen hinweg verschickt werden kann. Darum _müssen_ deine Objekte Parcelable sein. Sonst funktioniert es schlicht und ergreifend nicht.

    Du kommst schlicht nicht drum herum Parcelable zu implementieren.
     
  11. swordi, 05.10.2010 #11
    swordi

    swordi Gewerbliches Mitglied

    Beiträge:
    3,389
    Erhaltene Danke:
    441
    Registriert seit:
    09.05.2009
    ob du willst oder nicht - ohne gehts nicht
     
  12. emanuell, 05.10.2010 #12
    emanuell

    emanuell Threadstarter Neuer Benutzer

    Beiträge:
    13
    Erhaltene Danke:
    0
    Registriert seit:
    04.10.2010
    Ich habe nicht gesagt dass ich das nicht will:drool:. Nur bin ich mir mit iPhone App Entwicklung gewöhnt und dort geht das ganze ziemlich komfortabler. Aber egal.
    Wenn ich das ganze richtig verstanden habe: Anhand der Verwendung von Parcelable-Interface wird eine sprachneutrale serialisierung für die übertragung von parametern gewährleistet.
     
    Zuletzt bearbeitet: 05.10.2010
  13. emanuell, 05.10.2010 #13
    emanuell

    emanuell Threadstarter Neuer Benutzer

    Beiträge:
    13
    Erhaltene Danke:
    0
    Registriert seit:
    04.10.2010
    So hab mal das ganze probiert umzusetzen. Funktioniert auch. Ich habe eine Klasse ListOfPersonen die das Interface Parcelable implementiert.
    Ich kann jetzt auch eine Liste bzw. Array an ein Activity weitergeben.

    Wie kann ich diese Liste in ein ListView anzeigen lassen

    Code:
    private PersonenList listOfPersonen;
    Bundle b = getIntent().getExtras();
    listOfPersonen = b.getParcelable("meineListe");
    [SIZE=2].....[/SIZE]
    lv1=(ListView)findViewById(R.id.list);
    lv1.setAdapter(new ArrayAdapter<Person>(this,android.R.layout.simple_list_item_1 , listOfPersonen));
    
    kling einfach sollte es auch sein ich weiss nur nicht wo ansetzen :)
    Es zeigt einfach ch.test@78679 oder sowas an. das ist ein objekt :)

    ich weiss das bei setAdapter mein Fehler ist.

    meine Klasse PersonenList:
    Code:
    package ch.bauen;
    import java.util.ArrayList;
    import android.os.Parcel;
    import android.os.Parcelable;
     
    public class PersonenList extends ArrayList<Person> implements Parcelable
    {
            public PersonenList()
            {
            }
     
            public PersonenList(Parcel in)
            {
                    readFromParcel(in);
            }
     
            @SuppressWarnings("unchecked")
     
            public static final Parcelable.Creator CREATOR = new Parcelable.Creator() 
            {
                    public PersonenList createFromParcel(Parcel in) 
                    {
                            return new PersonenList(in);
                    }
     
                    public Object[] newArray(int arg0) 
                    {
                            return null;
                    }
            };
     
     
     
            private void readFromParcel(Parcel in) 
            {
                    this.clear();
                    int size = in.readInt();
     
                    for (int i = 0; i < size; i++) 
                    {
                            Person c = new Person();
                            c.setName(in.readString()); 
                            this.add(c);
                    }
            }
     
     
     
            public int describeContents() 
            {
                    return 0;
            }
     
     
     
            public void writeToParcel(Parcel dest, int flags) 
            {
                    int size = this.size();
                    dest.writeInt(size);
     
                    for (int i = 0; i < size; i++) 
                    {
                            Person c = this.get(i);
                            dest.writeString(c.getName());
                    }
     
            }
    }
     
    
     
    Zuletzt bearbeitet: 05.10.2010
  14. the_alien, 05.10.2010 #14
    the_alien

    the_alien Android-Lexikon

    Beiträge:
    1,559
    Erhaltene Danke:
    184
    Registriert seit:
    04.05.2009
    Du schreibst einen PersonArrayAdapter der ArrayAdapter<Person> überschreibt. Da bekommst du den View übergeben der in der Liste für einen Eintrag angezeigt wird und kannst ihn mit Leben füllen. (Kurzfassung)

    Und es ist klar, dass es beim iPhone total einfach geht, da gibt es keine Kommunikation über Prozessgrenzen hinweg ;)
     
  15. emanuell, 06.10.2010 #15
    emanuell

    emanuell Threadstarter Neuer Benutzer

    Beiträge:
    13
    Erhaltene Danke:
    0
    Registriert seit:
    04.10.2010
    Ich versteh deine Kurfassung nicht ganz. Was habe ich den grundlegend falsch gemacht beim füllen des Views.
     
  16. emanuell, 08.10.2010 #16
    emanuell

    emanuell Threadstarter Neuer Benutzer

    Beiträge:
    13
    Erhaltene Danke:
    0
    Registriert seit:
    04.10.2010
    can someone help me please :tongue:
     

Diese Seite empfehlen