How to send an ArrayList of objects to an activity on Android?
ex: I have an ArrayList of Books objects, I want when I click the button this array of objects are passed to another activity ..
How to send an ArrayList of objects to an activity on Android?
ex: I have an ArrayList of Books objects, I want when I click the button this array of objects are passed to another activity ..
There are three simple ways to pass a ArrayList
as a parameter to a Activity
.
Static methods:
Na ActivityA
// Dados a serem passados
ArrayList<Tipo> dados = ...;
Intent i = new Intent(this, ActivityB.class);
// Seta num campo estático da ActivityB
ActivityB.dados = dados;
startActivity(i);
Na ActivityB
@Override
public void onCreate(Bundle savedInstanceState) {
// Recupera os parâmetros passados pelo atributo estatico
ArrayList<Tipo> dados = ActivityB.dados;
// Limpar para nao ocorrer Leak
ActivityB.dados = null;
}
This form is not good, because it forces a Coupling between Activities
, which is not good practice, but it does exist.
Using the java.lang.Serializable
interface:
Na ActivityA
// Dados a serem passados
ArrayList<Tipo> dados = ...;
Intent i = new Intent(this, ActivityB.class);
// Seta num campo estático da ActivityB
i.putSerializableExtra("dados", dados);
startActivity(i);
Class Type
public class Tipo implements Serializable {
// Declaracao da sua classe
}
Na ActivityB
@Override
public void onCreate(Bundle savedInstanceState) {
// Recupera os parâmetros passados pelo atributo estatico
ArrayList<Tipo> dados = getIntent().getSerializableExtra("dados");
}
The class ArrayList
implements the interface Serializable
but, in order to work, the item that parameterizes ArrayList
also needs to implement Serializable
.
Using the Parcelable
interface:
Na ActivityA
// Dados a serem passados
ArrayList<Tipo> dados = ...;
Intent i = new Intent(this, ActivityB.class);
// Seta num campo estático da ActivityB
i.putParcelableArrayListExtra("dados", dados);
startActivity(i);
Class Type
public class Tipo implements Parcelable {
// Declaracao da sua classe
public Tipo(Parcel in) {
// Esse construtor apesar de nao ser requerido pela interface,
// e necessario por causa do protocolo implicito do Parcelable
// Lembrar da ordem que foi escrita no writeToParcel!!
seuCampoInt = in.readInt();
seuCampoString = in.readString();
// Demais campos
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
// Serializa os campos da sua classe,
// lembrando que essa ordem e importante no construtor
dest.writeInt(...);
dest.writeString(...);
}
// Como parte do contrato implicito,
// sua classe precisa de um atributo estatico chamado "CREATOR"
public static final Parcelable.Creator CREATOR = new Parcelable.Creator() {
public Tipo createFromParcel(Parcel in) {
return new Tipo(in);
}
public Tipo[] newArray(int size) {
return new Tipo[size];
}
};
}
Na ActivityB
@Override
public void onCreate(Bundle savedInstanceState) {
// Recupera os parâmetros passados pelo atributo estatico
ArrayList<Tipo> dados = getIntent().getParcelableArrayListExtra("dados");
}
In my opinion, it is best to use the Parcelable
interface, as it is proven to be faster 1 .
Any questions about Parcelable
, have a look at the Parcelable
documentation. and Parcelable.Creator
and Parcel
.
References: