22

How to pass Collections like ArrayList, etc from one Activity to another as we used to pass Strings, int with help of putExtra method of Intent?

Can anyone please help me as i want to pass a List<String> from one Activity to another?

Mudassir
  • 13,031
  • 8
  • 59
  • 87
Name is Nilay
  • 2,743
  • 4
  • 35
  • 77
  • 1
    Please do a search before posting; http://stackoverflow.com/search?q=Passing+object+from+one+activity+to+another – Khan Jul 05 '12 at 09:02
  • 1
    [**Please See this Blog. This Can Help You**](http://startandroiddevelopment.blogspot.in/2013/11/how-to-pass-boolean-int-string-integer.html) –  Nov 04 '13 at 04:45

6 Answers6

47

You can pass an ArrayList<E> the same way, if the E type is Serializable.

You would call the putExtra (String name, Serializable value) of Intent to store, and getSerializableExtra (String name) for retrieval.

Example:

ArrayList<String> myList = new ArrayList<String>();
intent.putExtra("mylist", myList);

In the other Activity:

ArrayList<String> myList = (ArrayList<String>) getIntent().getSerializableExtra("mylist");

Please note that serialization can cause performance issues: it takes time, and a lot of objects will be allocated (and thus, have to be garbage collected).

nhaarman
  • 98,571
  • 55
  • 246
  • 278
  • 7
    One thing worth mentioning is, `List` interface does not extend `Serializable` so if your collection is declared by interface you have to cast it to a specific implementation first. – SqueezyMo Aug 18 '16 at 10:21
24

First you need to create a Parcelable object class, see the example

public class Student implements Parcelable {

        int id;
        String name;

        public Student(int id, String name) {
            this.id = id;
            this.name = name;

        }

        public int getId() {
            return id;
        }

        public String getName() {
            return name;
        }


        @Override
        public int describeContents() {
            // TODO Auto-generated method stub
            return 0;
        }

        @Override
        public void writeToParcel(Parcel dest, int arg1) {
            // TODO Auto-generated method stub
            dest.writeInt(id);
            dest.writeString(name);
        }

        public Student(Parcel in) {
            id = in.readInt();
            name = in.readString();
        }

        public static final Parcelable.Creator<Student> CREATOR = new Parcelable.Creator<Student>() {
            public Student createFromParcel(Parcel in) {
                return new Student(in);
            }

            public Student[] newArray(int size) {
                return new Student[size];
            }
        };
    }

And the list

ArrayList<Student> arraylist = new ArrayList<Student>();

Code from Calling activity

Intent intent = new Intent(this, SecondActivity.class);
Bundle bundle = new Bundle();
bundle.putParcelableArrayList("mylist", arraylist);
intent.putExtras(bundle);       
this.startActivity(intent);

Code on called activity

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_second);   

    Bundle bundle = getIntent().getExtras();
    ArrayList<Student> arraylist = bundle.getParcelableArrayList("mylist");
}
Shahin ShamS
  • 498
  • 5
  • 7
  • Working like a charm, after an hour i got this, many thanks buddy. – Pankaj Arora Apr 11 '16 at 13:18
  • Its better to use serializable then this one, But Its good for someone. +1 – Harish Reddy Aug 02 '17 at 09:46
  • 1
    @HarishReddy Could you explain why using serializable is better? I thought Parcelable is better than serializable for the performance. – Expert wanna be Oct 20 '17 at 06:04
  • As it works on order basis as values are given in `writeToParcel`. Is there any mechanism to get values from `Parcel` object on key basis?. For example if in class we have multiple string fields then how can we come to know which string we are getting from `Parcel` in `Student(Parcel in)` . – Mashhood Qadeer May 26 '18 at 14:31
  • 1
    @HarishReddy: Using Serializable allows for a simpler implementation, but using Parcelable provides better performance. Which one is better depends on the circumstances: if the performance Serializable provides in your use case is adequate, then you should prefer the simpler approach. But if using Serializable is too slow in your use case, you should try using Parcelable instead. – stevehs17 Jan 30 '19 at 02:09
  • @Shahin ShamS Could you please have a look at this question. I tried to implement your solution there: https://stackoverflow.com/questions/68050680/how-to-display-data-from-one-activitys-recyclerview-to-another-activitys-recyc – Kumza Ion Jun 20 '21 at 03:44
5

use putExtra to pass value to an intent. use getSerializableExtra method to retrieve the data like this

Activity A :

ArrayList<String> list = new ArrayList<String>();

intent.putExtra("arraylist", list);
startActivity(intent);

Activity B:

ArrayList<String> list = getIntent().getSerializableExtra("arraylist");
Name is Nilay
  • 2,743
  • 4
  • 35
  • 77
RajaReddy PolamReddy
  • 22,428
  • 19
  • 115
  • 166
5

I tried all the proposed techniques but none of them worked and stopped my app from working and then I finally succedded. Here is how I did it... In main activity I did this:

            List<String> myList...;
            Intent intent = new Intent...;
            Bundle b=new Bundle();
            b.putStringArrayList("KEY",(ArrayList<String>)myList);            
            intent_deviceList.putExtras(b);
            ....startActivity(intent);

To get the data in the new Activity:

    List<String> myList...
    Bundle b = getIntent().getExtras();
    if (b != null) {
        myList = bundle.getStringArrayList("KEY");
    }

I hope this will help someone...

niky_d
  • 81
  • 1
  • 1
1

To pass ArrayList from one activity to another activity, one should include

intent.putStringArrayListExtra(KEY, list); //where list is ArrayList which you want to pass

before starting the activity.And to get the ArrayList in another activity include

Bundle bundle = getIntent().getExtras();
        if (bundle != null) {
            temp = bundle.getStringArrayList(KEY); // declare temp as ArrayList
                }

you will be able to pass ArrayList through this.Hope this will be helpful to you.

AkashG
  • 7,868
  • 3
  • 28
  • 43
0

Use of ViewModel is better fix than Serializable or Parcelable

Satyam Sharma
  • 21
  • 1
  • 2