13

Próbuję przekazać listę obiektów między dwiema czynnościami, ale moja aplikacja miażdży się podczas drugiej czynności. Czy ktoś może mi pomóc rozwiązać ten problem ...Przekazywanie tablicy obiektów między działaniami

Oto mój kod z mojej pierwszej działalności:

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

i kod z drugiego działalności:

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

I moje wyjście 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 [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) 
+0

ma Twój obiekt '' Parcelable' Song' wdrożyć? –

+0

@OvidiuLatcu no. Jak mogę to wdrożyć? –

+4

'public class Song implementuje Parcable {...}'. http://developer.android.com/reference/android/os/Parcelable.html –

Odpowiedz

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

do g et lista tablicowa w działaniu.

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

Mam nadzieję, że to ci pomoże.

Aby uzyskać więcej informacji, użyj tego link.

17

spróbować poniżej

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

odzyskać

getIntent().getParcelableArrayListExtra("key"); 

Pass arraylist of user defined objects to Intent android. Sprawdź odpowiedzi przez Sajmon

Zgodnie z uwagami Sajmon, Song klasa musi implementParcelable

+0

tak to działa:} ale najprawdopodobniej autorska klasa 'Song' nie implementuje' Parcelable'. – Sajmon

+0

@Sajmon Lista szufladek, które zasugerowałeś dla innego pytania, nie działa w tym przypadku? – Raghunandan

+0

Raghunandan działa to, co napisałem: 'ArrayList list' napisałem go" ogólnie "' -> 'drugi parametr' putParcelableArrayListExtra() 'musi być' ArrayList 'gdzie' T' implementuje 'Parcelable 'tak to na pewno działa również dla' ArrayList 'ale klasa' Song' musi implementować interfejs "Parcelable". – Sajmon

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

i odzyskać

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

To nie jest dobra metoda. –

+0

Dziękuję za odpowiedź, W celu przekazania tablicy String jest to najłatwiejsza metoda, jaką znalazłem, jeśli masz lepszą, proszę napisać o tym, że Pan Vinil Chandran (sir) –

+1

Przede wszystkim chodzi o obiekt nie jest ciągiem znaków. Przekazywanie przechodzącej tablicy tablic ciągów znaków //////////// Intencja intent = new Intent (getContext(), MainActivity.class); intent.putStringArrayListExtra ("KEY", stringArrayList); startActivity (zamiar); ///////////////// ArrayList stringArrayList = getIntent(). GetStringArrayListExtra ("KEY"); –