web-dev-qa-db-fra.com

Liste de passage d'objets entre les activités

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)
13
Darko Petkovski

Vous devez faire en sorte que votre classe Song implémente Parcelable .

10
Ovidiu Latcu

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 implementParcelable

20
Raghunandan
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");
6
Guru raj
     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 .

2
Nirmal

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());
            }
        }
    });
}
0
Agung Pramono