webentwicklung-frage-antwort-db.com.de

Arrayliste von Objekten zwischen Aktivitäten übergeben

Ich versuche, eine Arrayliste von Objekten zwischen zwei Aktivitäten zu übergeben, aber meine App bricht bei der zweiten Aktivität zusammen. Kann mir jemand helfen, dieses Problem zu lösen ...

Hier ist mein Code aus meiner ersten Aktivität:

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);

Und Code aus der zweiten Aktivität:

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

Und meine logcat-Ausgabe:

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 [email protected]
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

Sie sollten Ihre Song-Klasse in Parcelable implementieren lassen.

10
Ovidiu Latcu

Du versuchst das unten

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

Rufen Sie es ab

getIntent().getParcelableArrayListExtra("key");

Arrayliste von benutzerdefinierten Objekten an Intent Android übergeben . Überprüfen Sie die Antwort von Sajmon

Gemäß den Kommentaren von Sajmon muss Song class implementParcelable

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

und abrufen

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);

Um die Array-Liste in Aktivität zu bekommen.

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

Hoffe, das wird dir helfen.

Für weitere Informationen verwenden Sie diesen Link .

2
Nirmal

Bezieht sich auf diese Frage . Ich hoffe, dieses Beispiel hilft dir.

1. Ihre Song-Klasse sollte eine Parcelable-Klasse sein.

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

2. Platziere deine Arrayliste auf 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. In der 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
Agung Pramono