Отправить Arraylist по намерению

Как я могу получить кастом ArrayList из другой активности через Intent? Например, у меня есть это ArrayList в упражнении А:

ArrayList<Song> songs;

Как я могу получить этот список в упражнении B?

5 ответов

Решение

Первая часть, которую нужно понять, это то, что вы передаете информацию из Действия A в Деятельность B, используя Intent объект, внутри которого вы можете положить "дополнения". Полный список того, что вы можете положить в Intent доступно здесь: https://developer.android.com/reference/android/content/Intent.html (см. различные putExtra() методы, а также putFooExtra() методы ниже).

Так как вы пытаетесь передать ArrayList<Song> У вас есть два варианта.

Первое и лучшее - это использовать putParcelableArrayListExtra(), Чтобы использовать это, Song класс должен реализовать Parcelable интерфейс. Если вы контролируете исходный код Song, осуществляя Parcelable относительно легко. Ваш код может выглядеть так:

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

Второе - использовать версию putExtra() который принимает Serializable объект. Вы должны использовать эту опцию, только если вы не контролируете исходный код Song и, следовательно, не может реализовать Parcelable, Ваш код может выглядеть так:

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

Так вот, как вы кладете данные в Intent в упражнении А. Как вы получаете данные из Intent в деятельности B?

Это зависит от того, какой вариант вы выбрали выше. Если вы выбрали первое, вы напишите что-то похожее на это:

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

Если вы выбрали второе, вы напишите что-то похожее на это:

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

Преимущество первого метода заключается в том, что он быстрее (с точки зрения производительности вашего приложения для пользователя) и занимает меньше места (с точки зрения размера передаваемых данных).

Мисам отправляет список песен, поэтому он не может использовать простой putStringArrayList(), Вместо этого класс Song должен реализовывать интерфейс Parcelable. Я уже объяснил, как реализовать Parcelable безболезненно в посте здесь.

После реализации интерфейса Parcelable просто следуйте ответу Uddhavs с небольшими изменениями:

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

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

Я надеюсь, это поможет вам.

1. Ваш класс Song должен быть реализован Parcelable Class

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

2. Поместите свой arraylist, чтобы положить ParcelableArrayListExtra ()

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. В 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());
            }
        }
    });
}

для отправки строкового arrayList в Java вы можете использовать,

      intent.putStringArrayListExtra("key", skillist <- your arraylist);

а также

       List<String> listName = getIntent().getStringArrayListExtra("key");

Обратите внимание, что комплектация является одним из ключевых компонентов в системе Android, который используется для межкомпонентной связи. Все, что вам нужно подумать, это как вы можете использовать свой массив внутри этого пакета.

Отправляющая сторона (операция А)

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

/ * Примечание: вы должны использовать метод writeToParcel() для записи различных значений параметров вашего объекта Song */

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

Принимающая сторона (Деятельность B)

        Bundle bundle2 = getIntent().getBundleExtra("myBundle"); /* you got the passsed bundle */
        Parcelable[] arrayList2 = bundle.getParcelableArray("myParcelableArray"); 
Другие вопросы по тегам