send Arraylist by Intent

2019-05-27 09:37发布

问题:

How can I receive a custom ArrayList from another Activity via Intent? For example, I have this ArrayList in Activity A:

ArrayList<Song> songs;

How could I get this list inside Activity B?

回答1:

The first part to understand is that you pass information from Activity A to Activity B using an Intent object, inside which you can put "extras". The complete listing of what you can put inside an Intent is available here: https://developer.android.com/reference/android/content/Intent.html (see the various putExtra() methods, as well as the putFooExtra() methods below).

Since you are trying to pass an ArrayList<Song>, you have two options.

The first, and the best, is to use putParcelableArrayListExtra(). To use this, the Song class must implement the Parcelable interface. If you control the source code of Song, implementing Parcelable is relatively easy. Your code might look like this:

Intent intent = new Intent(ActivityA.this, ActivityB.class);
intent.putParcelableArrayListExtra("songs", songs);

The second is to use the version of putExtra() that accepts a Serializable object. You should only use this option when you do not control the source code of Song, and therefore cannot implement Parcelable. Your code might look like this:

Intent intent = new Intent(ActivityA.this, ActivityB.class);
intent.putSerializableExtra("songs", songs);

So that's how you put the data into the Intent in Activity A. How do you get the data out of the Intent in Activity B?

It depends on which option you selected above. If you chose the first, you will write something that looks like this:

List<Song> mySongs = getIntent().getParcelableArrayListExtra("songs");

If you chose the second, you will write something that looks like this:

List<Song> mySongs = (List<Song>) getIntent().getSerializableExtra("songs");

The advantage of the first technique is that it is faster (in terms of your app's performance for the user) and it takes up less space (in terms of the size of the data you're passing around).



回答2:

Misam is sending list of Songs so it can not use plain putStringArrayList(). Instead, Song class has to implement Parcelable interface. I already explained how to implement Parcelable painless in post here.

After implementing Parcelable interface just follow Uddhavs answer with small modifications:

// First activity, adding to bundle
bundle.putParcelableArrayListExtra("myArrayListKey", arrayList);

// Second activity, reading from bundle
ArrayList<Song> list = getIntent().getParcelableArrayListExtra("myArrayListKey");


回答3:

I hope this helps you.

1. Your Song class should be implements Parcelable Class

public class Song implements Parcelable { 
//Your setter and getter methods
}

2. Put your arraylist to putParcelableArrayListExtra()

public class ActivityA extends AppCompatActivity {
ArrayList<Song> songs;

@Override
protected void onCreate(Bundle savedInstanceState) {
button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            startActivity(new Intent(getApplicationContext(), ActivityB.class)
            .putParcelableArrayListExtra("songs", (ArrayList<? extends Parcelable>) songs));
        }
    });
}

3. In the ActivityB

public class ActivityB extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
    Intent intent = getIntent();
    final ArrayList<Song> songs = intent.getParcelableArrayListExtra("songs");

    //Check the value in the console
    buttonCheck.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            for (Song value : songs) {
                System.out.println(value.getTitle());
            }
        }
    });
}


回答4:

Please note, bundle is one of the key components in Android system that is used for inter-component communications. All you have to think is how you can use put your Array inside that bundle.

Sending side (Activity A)

    Intent intent1 = new Intent(MainActivity.this, NextActivity.class);
    Bundle bundle = new Bundle();
    Parcelable[] arrayList = new Parcelable[10];

/* Note: you have to use writeToParcel() method to write different parameters values of your Song object */

    /* you can add more string values in your arrayList */
    bundle.putParcelableArray("myParcelableArray", arrayList);        
    intent1.putExtra("myBundle", bundle);
    startActivity(intent1);

Receiving side (Activity B)

        Bundle bundle2 = getIntent().getBundleExtra("myBundle"); /* you got the passsed bundle */
        Parcelable[] arrayList2 = bundle.getParcelableArray("myParcelableArray");