Hilfe beim Übergeben von ArrayList und parzellierbarer Aktivität

Lesezeit: 5 Minuten

Hilfe beim Ubergeben von ArrayList und parzellierbarer Aktivitat
Wufu

Also habe ich die meiste Zeit von gestern und letzter Nacht gegoogelt und kann mir einfach nicht vorstellen, wie man eine Arrayliste an eine Unteraktivität weitergibt. Es gibt Unmengen von Beispielen und Snippets Primitive Datentypen, aber was ich habe, ist eine Arraylist des Typs die Anschrift (address.java unten).

Ich habe eine Menge Sachen auf Stackoverflow und im Internet dazu gefunden, aber nichts, was viel Aufmerksamkeit erregt hat, außer einem mit einem GeoPoint-Beispiel. Auch hier sah es für mich so aus, als hätten sie das GeoPoint-Objekt einfach in zwei Ganzzahlen abgeflacht und übergeben. Das kann ich nicht, weil meine Adressklasse möglicherweise so erweitert wird, dass sie Ganzzahlen, Gleitkommazahlen usw. enthält. Im Moment besteht die Test-App unten der Einfachheit halber nur aus zwei Zeichenfolgen. Ich dachte, wenn ich das Parcelalbe-Zeug damit zum Laufen bekomme, könnte der Rest folgen.

Kann jemand ein funktionierendes Beispiel für eine ArrayList eines nicht primitiven Objekts posten oder vielleicht unten Code hinzufügen, damit dies funktioniert?

AKTUALISIEREN: Code unten funktioniert jetzt nach Antworten/Bearbeiten. Danke!

/* helloParcel.java */        
       public class helloParcel extends Activity
{
    // holds objects of type 'address' == name and state
    private ArrayList <address> myList;

    @Override
    public void onCreate (Bundle savedInstanceState)
    {
        super.onCreate (savedInstanceState);
        setContentView (R.layout.main);

        Button b1 = (Button) findViewById(R.id.button1);
        b1.setOnClickListener(ocl);

        myList = new ArrayList();
        address frank   = new address ("frank", "florida");
        address mary    = new address ("mary", "maryland");
        address monty   = new address ("monty", "montana");

        myList.add (frank);
        myList.add (mary);
        myList.add (monty);

        // add the myList ArrayList() the the extras for the intent

    }

    OnClickListener ocl = new OnClickListener() 
    {

        @Override
        public void onClick(View v) 
        {
            // fill parceable and launch activity
            Intent intent = new Intent().setClass(getBaseContext (), subActivity.class);

            // for some reason, I remember a posting saying it's best to create a new
            // object to pass.  I have no idea why..
            ArrayList <address> addyExtras = new ArrayList <address>();

            for (int i = 0; i < myList.size(); i++)
                addyExtras.add (myList.get(i));

            intent.putParcelableArrayListExtra ("mylist", addyExtras);
            startActivity(intent);
        }
    };
} 



/* address.java */
  public class address implements Parcelable
{
    private String name;
    private String state;
    private static String TAG = "** address **";

    public address (String n, String s)
    {
        name = n;
        state = s;
        Log.d (TAG, "new address");
    }

    public address (Parcel in)
   {
    Log.d (TAG, "parcel in");
        name = in.readString ();
        state = in.readString ();
   }

    public String getState ()
    {
        Log.d (TAG, "getState()");
        return (state);
    }

    public String getName ()
    {
        Log.d (TAG, "getName()");
        return (name);
    }

    public static final Parcelable.Creator<address> CREATOR
    = new Parcelable.Creator<address>() 
   {
         public address createFromParcel(Parcel in) 
         {
            Log.d (TAG, "createFromParcel()");
             return new address(in);
         }

         public address[] newArray (int size) 
         {
            Log.d (TAG, "createFromParcel() newArray ");
             return new address[size];
         }
    };

    @Override
   public int describeContents ()
   {
        Log.d (TAG, "describe()");
       return 0;
   }

    @Override
   public void writeToParcel (Parcel dest, int flags)
   {
        Log.d (TAG, "writeToParcel");
       dest.writeString (name);
       dest.writeString (state);
   }

}


/* subActivity.java */
  public class subActivity extends Activity
{
    private final String TAG = "** subActivity **";
    private ArrayList <address> myList;

    @Override
    protected void onCreate (Bundle savedInstanceState)
    {
       super.onCreate (savedInstanceState);
       Log.d (TAG, "onCreate() in subActivity");

       setContentView(R.layout.subactivity);
       TextView tv1 = (TextView) findViewById(R.id.tv_sub);

       myList = getIntent().getParcelableArrayListExtra ("mylist");
       Log.d (TAG, "got myList");

       for (int i = 0; i < myList.size (); i++)
       {
        address a = myList.get (i);
        Log.d (TAG, "state:" + a.getState ());
        tv1.setText (a.getName () + " is from " + a.getState ());
       }

    }

}

  • Toll!!!!!!!!!!!! Gut gearbeitet, ich habe es zum ersten Mal benutzt. Danke

    – Selim Raza

    29. März 21 um 9:06 Uhr

1644072846 667 Hilfe beim Ubergeben von ArrayList und parzellierbarer Aktivitat
Markus Allison

Ich sehe hier mehrere Probleme:

  1. Warum addressParcelable verwenden? Warum nicht Adresse implementieren Parcelable, und dann verwenden:

    intent.putParcelableArrayListExtra( "addresses", addyExtras );
    
  2. Ihr parzellierbares Objekt muss einen statischen CREATOR enthalten. Siehe die Dokumentation für Details.

  3. Sie fügen der Absicht keine Extras hinzu, bevor Sie anrufen startActivity(). Siehe Punkt 1 für einen Vorschlag hier.

Ich denke, dass Sie alle diese Probleme angehen müssen, damit es funktioniert.

  • Irgendwann dachte ich, ich brauche eine zusätzliche Klasse (Implementierung von Parcelable), um das gesamte Objekt umzuwandeln. Ich denke, das ist, wo addressParcelable herkommt. Ich habe es aus dem obigen Code entfernt. Ich habe Ihre Vorschläge umgesetzt, wenn auch wahrscheinlich nicht richtig. Würdest du mal schauen wenn du Zeit hast? Ich bekomme einen Nullzeigerfehler in subActivity(), den ich jetzt zu finden versuche.

    – Wufu

    28. April 11 um 14:28 Uhr

  • Ich denke, dass Sie getIntent().getParcelableArrayList (“mylist”) und nicht savedInstanceState.getParcelableArrayList (“mylist”) aufrufen müssen;

    – Mark Allison

    28. April 11 um 14:37 Uhr


  • meinst du getParcelableArrayListExtra()? Habe das versucht, bekomme aber einen neuen Fehler (siehe neu bearbeiteten Code oben).

    – Wufu

    28. April 11 um 15:05 Uhr


  • 🙂 Ich denke, es funktioniert jetzt! Code oben bearbeitet – musste den Konstruktor in der Adressklasse ändern

    – Wufu

    28. April 11 um 15:36 Uhr


  • Gut gemacht, es zum Laufen zu bringen. Ich denke, Sie könnten auf addyExtras verzichten und haben nur intention.putParcelableArrayListExtra (“mylist”, myList); – was Ihnen das Durchlaufen der Liste ersparen würde

    – NickT

    28. April 11 um 16:39 Uhr

Es kann VIEL einfacher gemacht werden, ohne all den Aufwand der Implementierung Parcelable
ArrayList (aber KEINE List) ist Serializable. Sie können also die gesamte Liste verwenden putExtra() und mit abrufen getSerializableExtra(), wie Sam sagte.

ABER ich möchte noch eine wichtige Sache hinzufügen: Das Objekt, das Ihre Array-Liste speichert, muss auch implementiert werden Serializable… und alle anderen komplexen Objekte, die das Objekt enthalten kann (in Ihrem Fall keine), müssen dies ebenfalls implementieren (es ist also rekursiv – um ein Objekt zu serialisieren, müssen Sie in der Lage sein, alle seine Felder zu serialisieren).

Jetzt fragen Sie sich vielleicht, warum die Implementierung Serializable anstatt Parcelable wann gibt es schon Methoden zum Lesen und Schreiben von Array-Listen von Paketgütern? Nun … der Unterschied liegt in der Einfachheit – fügen Sie einfach hinzu implements Serializable und optional private static final long serialVersionUID = SOME_CONSTANT und du bist fertig! Das ist der Grund, warum ich nie benutze Parcelable – Sie können all diese Dinge mit tun Serializable mit buchstäblich 2 Zeilen Code – statt vieler Methodenvererbungen und all dem Zeug …

  • Der Vorteil von Parzellierbar über Serialisierbar ist, dass es ist viel Schneller. Wenn Ihre Liste groß ist, kann der Unterschied spürbar sein.

    – nikopico

    14. Mai 13 um 17:42 Uhr

Sie können serialisierbare Objekte über putExtra übergeben. ArrayList implementiert Serializable.

  • Große Hilfe. Danke schön. Man könnte meinen, es würde deutlicher gemacht werden.

    – Riot macht Schlag auf Schlag

    1. September 15 um 15:22 Uhr

Hilfe beim Ubergeben von ArrayList und parzellierbarer Aktivitat
Sam

Mike dg hat Recht!

putExtra() und getSerializable() speichert und ruft eine ab ArrayList<> Ihrer benutzerdefinierten Objekte, ohne dass eine Schnittstellenimplementierung erforderlich ist. Hat für mich funktioniert!

.

784470cookie-checkHilfe beim Übergeben von ArrayList und parzellierbarer Aktivität

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy