Pasar un ArrayList de tipo objeto a otra Actividad o Activity en Android

publicado por: Anonymous

Buenas noches, estoy intentando pasar un arraylist de tipo objeto de un activity a otro pero no me ha dado resultado. He intentado de esta forma sin exito.

Activity 1:

ArrayList<DatosReferencia> Lista = new ArrayList<>();

//Lo ejecuta un boton
   Intent i = new Intent(MainActivity.this, ReferenciasFavoritas.class);
            Bundle bundle = new Bundle();
            bundle.putSerializable("Lista",  Lista);
            i.putExtras(bundle);// Tambien lo he intentado con i.putExtra("Lista",  Lista); Quitando el bundle
            startActivity(i);

Activity 2:

ArrayList<DatosReferencia> lista = (ArrayList<DatosReferencia> ) getIntent().getSerializableExtra("Lista");

La clase DatosReferencia la tengo asi:

public class DatosReferencia implements Serializable // No posee subclases

La traza del error es esta:

E/AndroidRuntime: FATAL EXCEPTION: main
              Process: com.example.anaperez.myapplication, PID: 20802
              java.lang.IllegalStateException: Could not execute method for android:onClick
                  at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:293)
                  at android.view.View.performClick(View.java:4646)
                  at android.view.View$PerformClick.run(View.java:19403)
                  at android.os.Handler.handleCallback(Handler.java:733)
                  at android.os.Handler.dispatchMessage(Handler.java:95)
                  at android.os.Looper.loop(Looper.java:146)
                  at android.app.ActivityThread.main(ActivityThread.java:5511)
                  at java.lang.reflect.Method.invokeNative(Native Method)
                  at java.lang.reflect.Method.invoke(Method.java:515)
                  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1283)
                  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1099)
                  at dalvik.system.NativeStart.main(Native Method)
               Caused by: java.lang.reflect.InvocationTargetException
                  at java.lang.reflect.Method.invokeNative(Native Method)
                  at java.lang.reflect.Method.invoke(Method.java:515)
                  at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:288)
                  at android.view.View.performClick(View.java:4646) 
                  at android.view.View$PerformClick.run(View.java:19403) 
                  at android.os.Handler.handleCallback(Handler.java:733) 
                  at android.os.Handler.dispatchMessage(Handler.java:95) 
                  at android.os.Looper.loop(Looper.java:146) 
                  at android.app.ActivityThread.main(ActivityThread.java:5511) 
                  at java.lang.reflect.Method.invokeNative(Native Method) 
                  at java.lang.reflect.Method.invoke(Method.java:515) 
                  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1283) 
                  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1099) 
                  at dalvik.system.NativeStart.main(Native Method) 
               Caused by: java.lang.RuntimeException: Parcelable encountered IOException writing serializable object (name = com.example.anaperez.myapplication.DatosReferencia)
                  at android.os.Parcel.writeSerializable(Parcel.java:1316)
                  at android.os.Parcel.writeValue(Parcel.java:1264)
                  at android.os.Parcel.writeList(Parcel.java:653)
                  at android.os.Parcel.writeValue(Parcel.java:1226)
                  at android.os.Parcel.writeArrayMapInternal(Parcel.java:618)
                  at android.os.Bundle.writeToParcel(Bundle.java:1692)
                  at android.os.Parcel.writeBundle(Parcel.java:636)
                  at android.content.Intent.writeToParcel(Intent.java:7327)
                  at android.app.ActivityManagerProxy.startActivity(ActivityManagerNative.java:2276)
                  at android.app.Instrumentation.execStartActivity(Instrumentation.java:1425)
                  at android.app.Activity.startActivityForResult(Activity.java:3510)
                  at android.support.v4.app.BaseFragmentActivityApi16.startActivityForResult(BaseFragmentActivityApi16.java:54)
                  at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:67)
                  at android.app.Activity.startActivityForResult(Activity.java:3471)
                  at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:720)
                  at android.app.Activity.startActivity(Activity.java:3713)
                  at android.app.Activity.startActivity(Activity.java:3681)
                  at com.example.anaperez.myapplication.MainActivity.onClick(MainActivity.java:121)
                  at java.lang.reflect.Method.invokeNative(Native Method) 
                  at java.lang.reflect.Method.invoke(Method.java:515) 
                  at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:288) 
                  at android.view.View.performClick(View.java:4646) 
                  at android.view.View$PerformClick.run(View.java:19403) 
                  at android.os.Handler.handleCallback(Handler.java:733) 
                  at android.os.Handler.dispatchMessage(Handler.java:95) 
                  at android.os.Looper.loop(Looper.java:146) 
                  at android.app.ActivityThread.main(ActivityThread.java:5511) 
                  at java.lang.reflect.Method.invokeNative(Native Method) 
                  at java.lang.reflect.Method.invoke(Method.java:515) 
                  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1283) 
                  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1099) 
                  at dalvik.system.NativeStart.main(Native Method) 
               Caused by: java.io.NotSerializableException: android.graphics.Bitmap
                  at java.io.ObjectOutputStream.writeNewObject(ObjectOutputStream.java:1364)
                  at java.io.ObjectOutputStream.writeObjectInternal(ObjectOutputStream.java:1671)
                  at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1517)
                  at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1481)
                  at java.io.ObjectOutputStream.writeFieldValues(ObjectOutputStream.java:979)
                  at java.io.ObjectOutputStream.defaultWriteObject(ObjectOutputStream.java:368)
                  at java.io.ObjectOutputStream.writeHierarchy(ObjectOutputStream.java:1074)
                  at java.io.ObjectOutputStream.writeNewObject(ObjectOutputStream.java:1404)
                  at java.io.ObjectOutputStream.writeObjectInternal(ObjectOutputStream.java:1671)
                  at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1517)
                  at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1481)
                  at android.os.Parcel.writeSerializable(Parcel.java:1311)
                  at android.os.Parcel.writeValue(Parcel.java:1264) 
                  at android.os.Parcel.writeList(Parcel.java:653) 
                  at android.os.Parcel.writeValue(Parcel.java:1226) 
                  at android.os.Parcel.writeArrayMapInternal(Parcel.java:618) 
                  at android.os.Bundle.writeToParcel(Bundle.java:1692) 
                  at android.os.Parcel.writeBundle(Parcel.java:636) 
                  at android.content.Intent.writeToParcel(Intent.java:7327) 
                  at android.app.ActivityManagerProxy.startActivity(ActivityManagerNative.java:2276) 
                  at android.app.Instrumentation.execStartActivity(Instrumentation.java:1425) 
                  at android.app.Activity.startActivityForResult(Activity.java:3510) 
                  at android.support.v4.app.BaseFragmentActivityApi16.startActivityForResult(BaseFragmentActivityApi16.java:54) 
                  at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:67) 
                  at android.app.Activity.startActivityForResult(Activity.java:3471) 
                  at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:720) 
                  at android.app.Activity.startActivity(Activity.java:3713) 
                  at android.app.Activity.startActivity(Activity.java:3681) 
                  at com.example.anaperez.myapplication.MainActivity.onClick(MainActivity.java:121) 
                  at java.lang.reflect.Method.invokeNative(Native Method) 
                  at java.lang.reflect.Method.invoke(Method.java:515) 
                  at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:288) 
                  at android.view.View.performClick(View.java:4646) 
                  at android.view.View$PerformClick.run(View.java:19403) 
                  at android.os.Handler.handleCallback(Handler.java:733) 
                  at android.os.Handler.dispatchMessage(Handler.java:95) 
                  at android.os.Looper.loop(Looper.java:146) 
                  at android.app.ActivityThread.main(ActivityThread.java:5511) 
                  at java.lang.reflect.Method.invokeNative(Native Method) 
                  at java.lang.reflect.Method.invoke(Method.java:515) 
                  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1283) 
                  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1099) 
                  at dalvik.system.NativeStart.main(Native Method) 

Muchas gracias por sus sugerencias.

solución

Te recomiendo que implementes Parcelable en lugar de Serializable que es más rápido (El proceso de serialización crea muchos objetos por lo cual es más trabajo para el GC) y está pensado para estas ocasiones.

El código para ponerlo en el intent sería el siguiente:

Intent i = new Intent(MainActivity.this, ReferenciasFavoritas.class);
i.putParcelableArrayListExtra("Lista",  Lista);
startActivity(i);

Y para recuperarlo desde el intent:

ArrayList<DatosReferencia> lista = getIntent().getParcelableArrayListExtra("Lista");

Si necesitas ayuda para implementar parcelable, agrega el código de la clase DatosReferencia

Respondido por: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *