2012-02-23 10 views
5

sto cercando di passare un arraylist all'attività dei miei genitoriinvio di un arraylist all'attività padre

Ecco il codice semplice.

private ArrayList<Receipt> receipts = new ArrayList<Receipt>(); 


Intent data = new Intent(); 
data. // what to do here? 
setResult(RESULT_OK, data); 

//************************************ 

Questa è classe ricevimento di base

public class Receipt { 


    public String referenceNo; 
    public byte[] image; 
    public String comments; 
    public Date createdOn; 
    public Date updatedOn; 

Dimmi come posso aggiungere nel mio intento e come posso recuperarlo indietro nell'attività genitore da

onActivityResult(final int requestCode, int resultCode, final Intent data) 
+1

Hai controllato questa domanda? -> http://stackoverflow.com/questions/5207510/android-passing-an-arraylist-back-to-parent-activity –

+0

http: // stackoverflow.it/questions/4626861/put-object-as-intent-for-next-activity ..... simile a questo ??? –

risposta

3

È possibile utilizzare data.putExtra()/bundle.putSerializable() di mettere oggetti personalizzati in un bundle/Intent, tuttavia, è necessario per rendere la vostra ricevuta classe implementare Serializable (appena messo implements Serializable dopo il nome della classe, questo è tutto che c'è da fare con una classe così semplice Poi di leggerlo di nuovo utilizzare getSerializable()

Nota:.. non credo che i Date -clas s è serializzabile, potresti invece voler sostituire quelli con un tempo di rappresentazione lungo in millisecondi (puoi usare Date.getTime() per quello).

Esempio:

public class Receipt implements Serializable{ 
    public String referenceNo; 
    public byte[] image; 
    public String comments; 
    public long createdOn; 
    public long updatedOn; 
    //... 
} 

//Put the list in the intent 
List<Receipt> list = ... 
Intent data = new Intent(); 
data.putExtra("tag", list); 

//Read the list from the intent: 
list = (List<Receipt>) data.getSerializableExtra("tag"); 
0

Si può semplicemente passare il vostro ArrayList e recuperare di nuovo.

Ad esempio:

ArrayList<Receipt> list = new ArrayList<Receipt>(); 
intent intent = new Intent(); 
intent.putExtra("Hello", list); 

Ma assicuratevi di avere a implements Serializable interfaccia nella classe ricevuta.

cioè

public class Receipt implements Serializable 
0

Nel caso la vostra ArrayList sta per essere grande passarlo come dati Intent può causare problemi come l'applicazione non risponde. Questo perché ci vorrà del tempo perché il sistema operativo passi tutti i dati.

Invece, è possibile creare la propria classe di applicazione (è necessario registrarla anche nel manifesto). Poi in questa classe si può avere

class MyApplication extends Application { 
... 
public static Object mData; 
} 

E si può poi fare MyApplication.mData = receipts e ArrayList<Receipt> receipts = (ArrayList<Receipt>)(MyApplication.mData) a seconda dei casi.

Poiché l'oggetto MyApplication esisterà per tutto il ciclo di vita dell'app, questo metodo è abbastanza sicuro ed è consigliato nei libri su Android (tra gli altri).

+1

questo metodo non è raccomandato – Selvin

+0

è uno dei metodi proposti per lo scambio di dati nel libro Pro Android 3 e altrove. Ad ogni modo, cosa c'è di male in questo metodo che stai dicendo che non è raccomandato. Prova a passare un array molto grande tramite dati di intent e vedrai l'errore ANR. –

+0

prima: ho dato un'occhiata a questo libro e bene non posso dire cose positive a riguardo. secondo: l'oggetto globale non verrà liberato fino alla fine dell'applicazione. ecco perché thrid: questo problema è più complicato ... perché per il bene di FSM usare l'intento di passare il grande array a tutti. se c'è bisogno di questo significa che l'applicazione è stata progettata male. secondo me in questo caso dovremmo usare ContentProvider e passare solo Uri (Intent.getData()), dopo che ContentProvider "ha chiesto" con questo Uri dovrebbe restituire il cursore con tutti i dati di cui abbiamo bisogno – Selvin

Problemi correlati