在活动之间传递对象数组列表

18
我试图在两个活动之间传递一个对象的ArrayList,但是我的应用程序在第二个活动中崩溃。有人能帮我解决这个问题吗...
这是来自我的第一个活动的代码:
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)

你的 Song 对象实现了 Parcelable 接口吗? - Ovidiu Latcu
@OvidiuLatcu 不行。我该如何实现? - Darko Petkovski
4
公共类 Song 实现 Parcelable 接口。请参阅 http://developer.android.com/reference/android/os/Parcelable.html - Ovidiu Latcu
@OvidiuLatcu 是的,那就是答案。你能把你的答案发出来让我接受吗? - Darko Petkovski
6个回答

22
你可以尝试以下操作:
intent.putParcelableArrayListExtra("key", ArrayList<T extends Parcelable> list);
startActivity(intent);

获取它。
getIntent().getParcelableArrayListExtra("key");

传递自定义对象的ArrayList到Intent Android,请查看Sajmon的答案。

根据Sajmon的评论,Song类必须实现Parcelable接口。


我能像在Java中一样传递arrayList吗(使用对象)? - Amit0191
@Amit0191 你的意思是一个对象列表。是的,如果你的模型类实现了 Parcelable 接口,那么你可以这样做。 - Raghunandan
不,我不是指对象列表。 - Amit0191
@Raghunandan,我能像在两个类之间传递ArrayList一样(在活动之间)传递吗?(Class A有一个ArrayList,在Class B中创建Class A的实例并使用它来访问ArrayList)如果其中一个类是活动而另一个不是呢? 谢谢。 - Amit0191
@Amit0191,你可以在活动之间传递ArrayList,因为ArrayList实现了Serializable接口。你永远不应该创建一个活动类的实例。你只需要在清单文件中声明它,这是Android的工作。 - Raghunandan
显示剩余4条评论

12

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

并且检索

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

谢谢您的回复,为了传递字符串数组,这是我找到的最简单的方法,如果您有更好的方法,请在下面发表,Vinil Chandran先生。 - Guru raj
2
首先,这个问题是关于对象而不是字符串的。要传递字符串ArrayList://////////// Intent intent = new Intent(getContext(),MainActivity.class); intent.putStringArrayListExtra("KEY",stringArrayList); startActivity(intent);///////////////// ArrayList<String> stringArrayList = getIntent().getStringArrayListExtra("KEY"); - Vinil Chandran

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

获取活动中的数组列表。
ArrayList<String> fetchList= new ArrayList<String>();
fetchList=  getIntent().getStringArrayListExtra("list");

希望这能帮到你。

如需更多参考,请使用此链接


2

指的是这个问题。希望这个例子能帮到你。

1. 你的Song类应该实现Parcelable接口

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

2. 将你的arraylist放入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());
            }
        }
    });
}

0
你可以像这样让Songs类实现Serializable接口。
``` public class Songs implements Serializable{ // your code here } ```
在第一个Activity中。
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");

也许应该使用类 Parcelable 而不是 Serializable - aolphn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接