J'essaie de passer un arraylist d'objets entre deux activités, mais mon application écrase à la deuxième activité. Quelqu'un peut-il m'aider à résoudre ce problème ...
Voici mon code de ma première activité:
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);
Et code de la deuxième activité:
songs=new ArrayList<Songs>();
Bundle b = this.getIntent().getExtras();
if(b!=null)
songs = b.getParcelable("songs");
Log.v("--", songs.size()+"");
Et ma sortie 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)
Vous devez faire en sorte que votre classe Song
implémente Parcelable
.
Vous essayez le ci-dessous
intent.putParcelableArrayListExtra("key", ArrayList<T extends Parcelable> list);
startActivity(intent);
Le récupérer
getIntent().getParcelableArrayListExtra("key");
Passer la liste des objets définis par l'utilisateur à l'intention Android . Vérifiez la réponse de Sajmon
Selon les commentaires de Sajmon, la classe Song
doit implement
Parcelable
Intent intent=new Intent(ActivityFrom.this,ActivityTo.class);
intent.putExtra("StringKey",arrayList);
startActivity(intent);
et pour récupérer
ArrayList<String> myList = (ArrayList<String>) getIntent().getSerializableExtra("StringKey");
i.setClass(LatestAlbums.this, AlbumDetails.class);
i.putStringArrayListExtra("list", your song list);
startActivity(i);
Pour obtenir la liste de tableaux en activité.
ArrayList<String> fetchList= new ArrayList<String>();
fetchList= getIntent().getStringArrayListExtra("list");
J'espère que ceci vous aidera.
Pour plus de références, utilisez link .
Se réfère à cette question . J'espère que cet exemple vous aide.
_ {1. Votre classe de chanson devrait implémenter une classe parcelable} _
public class Song implements Parcelable {
//Your setter and getter methods
}
2. Mettez votre 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. Dans l'activitéB
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());
}
}
});
}