Send an ArrayList of objects to an Activity

3

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 ..

    
asked by anonymous 30.07.2014 / 23:52

1 answer

10

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:

  • link
  • 31.07.2014 / 02:42