Отправить 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");