Domanda

Così ho googling più di ieri e ultima notte e proprio non riesco ad avvolgere la mia testa intorno come passare un ArrayList ad un sottosettore. Ci sono tonnellate di esempi e frammenti di passaggio primitivi i tipi di dati, ma quello che ho è un ArrayList di tipo Indirizzo (address.java sotto).

ho trovato un sacco di roba su StackOverflow e tutto il web su questo, ma niente che ha ottenuto un sacco di attenzione ad eccezione di una con un esempio GeoPoint. Ancora una volta, sembrava a me come hanno appena appiattite l'oggetto GeoPoint in due numeri interi e passato in. Non posso farlo perché la mia classe indirizzo può espandersi per includere interi, galleggianti, a prescindere. In questo momento, l'applicazione di test che segue è solo due corde per semplicità. Ho pensato che se ho potuto ottenere il lavoro roba parcelalbe con questo, il resto potrebbe seguire.

Can qualcuno posta un esempio di lavoro per un ArrayList di un oggetto non primitivo, o forse aggiungere il codice qui sotto per fare questo lavoro?

Aggiorna : codice qui sotto è ora al lavoro dopo risposte / modifica. Grazie!

/* 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 ());
       }

    }

}
È stato utile?

Soluzione

posso vedere una serie di problemi qui:

  1. Perché usare addressParcelable? Perché non fare indirizzo implementare Parcelable, e quindi utilizzare:

    intent.putParcelableArrayListExtra( "addresses", addyExtras );
    
  2. Il vostro Parcelable deve includere un creatore statica. Vedere la documentazione per i dettagli.

  3. Lei non è in realtà aggiungere alcun extra per l'intento prima di chiamare startActivity(). Vedi punto 1 per un suggerimento qui.

Credo che sarà necessario affrontare tutti questi problemi al fine di farlo funzionare.

Altri suggerimenti

Si può fare molto più semplice, senza tutto il dolore-in-the-ass di attuare Parcelable ... ArrayList (ma NON qualsiasi List) è Serializable. Così, si può mettere l'intero elenco utilizzando putExtra() e recuperarlo usando getSerializableExtra(), come ha detto Sam.

MA, voglio aggiungere una cosa più importante: l'oggetto vostra lista di array negozi deve implementare anche Serializable ... e tutti gli altri oggetti complessi che l'oggetto può contenere (nel tuo caso nessuno) deve anche implementare che (così è ricorsivo -. al fine di serializzare un oggetto, è necessario essere in grado di serializzare tutti i suoi campi)

Ora, si potrebbe chiedere se stessi perché attuazione Serializable invece di Parcelable quando ci sono già i metodi per la lettura e la scrittura di liste di array di parcelables? Beh ... la differenza è la semplicità - basta aggiungere implements Serializable e opzionalmente private static final long serialVersionUID = SOME_CONSTANT e il gioco è fatto! Questo è il motivo per cui io non uso mai Parcelable - si possono fare tutte quelle cose che utilizzano Serializable con letteralmente 2 righe di codice - invece di molte eredità metodo e tutta quella roba ...

È possibile passare oggetti Serializable via putExtra. implementa Serializable ArrayList.

Mike dg è corretta!

putExtra() e getSerializable() sarà memorizzare e recuperare un ArrayList<> dei vostri oggetti personalizzati, senza interfaccia di esecuzione richiesti. Ha lavorato per me!

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top