Передача массива объектов между действиями

Я пытаюсь передать массив объектов между двумя действиями, но мое приложение падает во втором действии. Может ли кто-нибудь помочь мне решить эту проблему...

Вот мой код из моего первого действия:

Intent i = new Intent();
Bundle b = new Bundle();
b.putParcelableArrayList("songs",(ArrayList<? extends Parcelable>) albumsArray.get(position).getSongs());
Log.v("--", "OK");
i.putExtras(b);
i.setClass(LatestAlbums.this, AlbumDetails.class);
startActivity(i);

И код из второго действия:

songs=new ArrayList<Songs>();
Bundle b = this.getIntent().getExtras();
if(b!=null)
    songs = b.getParcelable("songs");
Log.v("--", songs.size()+"");

И мой вывод logcat:

04-03 16:37:03.513: E/AndroidRuntime(6576): FATAL EXCEPTION: main
04-03 16:37:03.513: E/AndroidRuntime(6576): java.lang.RuntimeException: Parcel: unable to marshal value com.musicapp.objects.Songs@419489e8
04-03 16:37:03.513: E/AndroidRuntime(6576):     at android.os.Parcel.writeValue(Parcel.java:1137)
04-03 16:37:03.513: E/AndroidRuntime(6576):     at android.os.Parcel.writeList(Parcel.java:524)
04-03 16:37:03.513: E/AndroidRuntime(6576):     at android.os.Parcel.writeValue(Parcel.java:1097)
04-03 16:37:03.513: E/AndroidRuntime(6576):     at android.os.Parcel.writeMapInternal(Parcel.java:493)
04-03 16:37:03.513: E/AndroidRuntime(6576):     at android.os.Bundle.writeToParcel(Bundle.java:1612)
04-03 16:37:03.513: E/AndroidRuntime(6576):     at android.os.Parcel.writeBundle(Parcel.java:507)
04-03 16:37:03.513: E/AndroidRuntime(6576):     at android.content.Intent.writeToParcel(Intent.java:6147)
04-03 16:37:03.513: E/AndroidRuntime(6576):     at android.app.ActivityManagerProxy.startActivity(ActivityManagerNative.java:1613)
04-03 16:37:03.513: E/AndroidRuntime(6576):     at android.app.Instrumentation.execStartActivity(Instrumentation.java:1379)
04-03 16:37:03.513: E/AndroidRuntime(6576):     at android.app.Activity.startActivityFromChild(Activity.java:3458)
04-03 16:37:03.513: E/AndroidRuntime(6576):     at android.app.Activity.startActivityForResult(Activity.java:3210)
04-03 16:37:03.513: E/AndroidRuntime(6576):     at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:817)
04-03 16:37:03.513: E/AndroidRuntime(6576):     at android.app.Activity.startActivity(Activity.java:3297)
04-03 16:37:03.513: E/AndroidRuntime(6576):     at com.outsourcefarm.musicagratis.activities.LatestAlbums$4$1.onItemClick(LatestAlbums.java:232)
04-03 16:37:03.513: E/AndroidRuntime(6576):     at android.widget.AdapterView.performItemClick(AdapterView.java:292)
04-03 16:37:03.513: E/AndroidRuntime(6576):     at android.widget.AbsListView.performItemClick(AbsListView.java:1058)
04-03 16:37:03.513: E/AndroidRuntime(6576):     at android.widget.AbsListView$PerformClick.run(AbsListView.java:2514)
04-03 16:37:03.513: E/AndroidRuntime(6576):     at android.widget.AbsListView$1.run(AbsListView.java:3168)
04-03 16:37:03.513: E/AndroidRuntime(6576):     at android.os.Handler.handleCallback(Handler.java:605)
04-03 16:37:03.513: E/AndroidRuntime(6576):     at android.os.Handler.dispatchMessage(Handler.java:92)
04-03 16:37:03.513: E/AndroidRuntime(6576):     at android.os.Looper.loop(Looper.java:137)
04-03 16:37:03.513: E/AndroidRuntime(6576):     at android.app.ActivityThread.main(ActivityThread.java:4440)
04-03 16:37:03.513: E/AndroidRuntime(6576):     at java.lang.reflect.Method.invokeNative(Native Method)
04-03 16:37:03.513: E/AndroidRuntime(6576):     at java.lang.reflect.Method.invoke(Method.java:511)
04-03 16:37:03.513: E/AndroidRuntime(6576):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:787)
04-03 16:37:03.513: E/AndroidRuntime(6576):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:554)
04-03 16:37:03.513: E/AndroidRuntime(6576):     at dalvik.system.NativeStart.main(Native Method)

person Darko Petkovski    schedule 03.04.2013    source источник
comment
ваш объект Song реализует Parcelable?   -  person Ovidiu Latcu    schedule 03.04.2013
comment
@OvidiuLatcu нет. Как я могу это реализовать?   -  person Darko Petkovski    schedule 03.04.2013
comment
public class Song implements Parcelable {...} . developer.android.com/reference/android/os/Parcelable.html   -  person Ovidiu Latcu    schedule 03.04.2013
comment
@OvidiuLatcu да, это ответ. Не могли бы вы опубликовать свой ответ, чтобы я принял его   -  person Darko Petkovski    schedule 03.04.2013


Ответы (6)


Вы должны сделать свой класс Song реализацией Parcelable.

person Ovidiu Latcu    schedule 03.04.2013

Вы попробуете ниже

intent.putParcelableArrayListExtra("key", ArrayList<T extends Parcelable> list);
startActivity(intent);

Получить его

getIntent().getParcelableArrayListExtra("key");

Передать массив пользовательских объектов в Intent android. Проверьте ответ Саймона

Согласно комментариям Саймона, Song класс должен implement Parcelable

person Raghunandan    schedule 03.04.2013
comment
да, это работает:} но, скорее всего, авторский класс Song не реализует Parcelable. - person Simon Dorociak; 03.04.2013
comment
@Sajmon Саймон, обертывающий массив, который вы предложили для другого вопроса, не работает в этом случае? - person Raghunandan; 03.04.2013
comment
Raghunandan, это работает так, как я написал: ArrayList<T extends Parcelable> list я написал это, как правило, --> второй параметр putParcelableArrayListExtra() должен быть ArrayList<T>, где T реализует Parcelable, поэтому он точно работает и для ArrayList<Song>, но класс Song должен реализовывать Parcelable интерфейс. - person Simon Dorociak; 03.04.2013
comment
Итак, класс Song должен реализовать Parcelable. - person Raghunandan; 03.04.2013
comment
Могу ли я передать arrayList, как вы это делаете в Java (используя объекты)? - person Amit0191; 27.08.2015
comment
@ Amit0191, ты имеешь в виду список объектов. Да, вы можете это сделать, если ваш класс модели реализует Parcelable. - person Raghunandan; 28.08.2015
comment
Нет, я не имел в виду список объектов. - person Amit0191; 29.08.2015
comment
@Raghunandan Могу ли я передать ArrayList (между действиями), как мы это делаем между двумя классами (у класса A есть arrayList. Создайте экземпляр в классе B класса A и используйте его для доступа к arrayList)? А если один класс является активностью, а другой нет? Спасибо. - person Amit0191; 29.08.2015
comment
@ Amit0191, вы можете передавать arraylist между действиями, потому что arraylist реализует сериализуемость. Вы никогда не должны создавать экземпляр класса активности. Вы только объявляете это в манифесте. это задача андроида. - person Raghunandan; 29.08.2015

Intent intent=new Intent(ActivityFrom.this,ActivityTo.class);
intent.putExtra("StringKey",arrayList);
startActivity(intent);

и получить

ArrayList<String> myList = (ArrayList<String>) getIntent().getSerializableExtra("StringKey");
person Guru raj    schedule 21.11.2016
comment
Спасибо за ответ. Чтобы передать массив строк, это самый простой метод, который я нашел, если у вас есть лучший, напишите, что мистер Винил Чандран (сэр) - person Guru raj; 22.06.2017
comment
Прежде всего, вопрос касается объекта, а не строки. Для передачи передаваемой строки arraylist //////////// Intentintent = new Intent(getContext(),MainActivity.class); намерение.putStringArrayListExtra (KEY, stringArrayList); startActivity(намерение); ///////////////// ArrayList‹String› stringArrayList = getIntent().getStringArrayListExtra(KEY); - person Vinil Chandran; 22.06.2017

     i.setClass(LatestAlbums.this, AlbumDetails.class);
     i.putStringArrayListExtra("list", your song list);
     startActivity(i);

Чтобы получить список массивов в деятельности.

ArrayList<String> fetchList= new ArrayList<String>();
fetchList=  getIntent().getStringArrayListExtra("list");

Надеюсь, что это поможет вам.

Для получения дополнительной информации используйте эту ссылку.

person Nirmal    schedule 03.04.2013

Относится к этому вопросу. Я надеюсь, что этот пример поможет вам.

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

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

<сильный>2. Поместите свой список массивов в 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. В 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());
            }
        }
    });
}
person Agung Pramono    schedule 16.02.2019

Вы можете сделать так, чтобы класс Songs реализовывал Serializable таким образом.

public class Songs implements Serializable{ // your code here }.

В первом упражнении

Intent intent =  new Intent(MainActivity.this,Main2Activity.class);
Bundle bundle = new Bundle();
bundle.putSerializable("Songs",arrSongs); //where arrSongs is object of  ArrayList<Songs>

intent.putExtras(bundle);
startActivity(intent);

В SecondActivity, где вы хотите получить объект ArrayList

 Bundle bundle =  getIntent().getExtras();
 private ArrayList<Songs> items;
 items = (ArrayList<Songs>)bundle.getSerializable("Songs");
person Preeti    schedule 14.04.2020
comment
Возможно, следует использовать класс Parcelable вместо Sertializable - person aolphn; 15.04.2020