2015-01-03 2 views
0

Я пытаюсь отправить ArrayList объектов в другую деятельность, но я получил эту ошибку на logcat, и я не могу найти способ ее решить, я новичок.Отправить массив объектов другому виду деятельности

GrupoMuscular класс:

public class GrupoMuscular implements Parcelable{ 

    private int id; 
    private static int id_aux = 0; 
    private String nome; 
    private int imagem; 
    private List<Exercicio> exercicios; 

    public GrupoMuscular(String nome, int img) { 
     //super(); 
     id = id_aux; 
     id_aux++; 
     this.nome = nome; 
     this.imagem = img; 
     this.exercicios = new ArrayList<Exercicio>(); 
    } 

    public String getNome() { 
     return nome; 
    } 

    public void setNome(String nome) { 
     this.nome = nome; 
    } 

    public int getImagem() { 
     return imagem; 
    } 

    public void setImagem(int imagem) { 
     this.imagem = imagem; 
    } 

    public List<Exercicio> getGruposMuscular() { 
     return exercicios; 
    } 

    public void addExercicio(int id, String nome, String descricao, int imagem){   
     Exercicio ex = new Exercicio(id, nome, descricao, imagem); 
     exercicios.add(ex); 
    } 

    public void setGruposMuscular(List<Exercicio> gruposMuscular) { 
     this.exercicios = gruposMuscular; 
    } 

    public List<Exercicio> getExercicios() { 
     return exercicios; 
    } 

    public void setExercicios(List<Exercicio> exercicios) { 
     this.exercicios = exercicios; 
    } 

    public int getId() { 
     return id; 
    } 

    public void setId(int id) { 
     this.id = id; 
    } 

    @Override 
    public int describeContents() { 
     // TODO Auto-generated method stub 
     return 0; 
    } 

    @Override 
    public void writeToParcel(Parcel dest, int flags) { 
     // TODO Auto-generated method stub 

    } 
} 

ExerciciosActivity: Вот когда я пытаюсь отправить массив, когда я нажимаю на элемент в ListView.

listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 

       @Override 
       public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 

        Intent intent; 

         intent = new Intent(ExerciciosActivity.this, ListaExerciciosActivity.class); 
         intent.putParcelableArrayListExtra("gruposMusculares", gruposMusculares); 
         startActivity(intent); 
       }}); 
      } 

ListaExerciciosActivity: Вот где я хочу получить массив.

gruposMusculares = getIntent().getParcelableArrayListExtra("gruposMusculares"); 

Logcat:

01-03 18:24:08.889: E/AndroidRuntime(18813): FATAL EXCEPTION: main 
01-03 18:24:08.889: E/AndroidRuntime(18813): Process: com.AMOV.mr.fit, PID: 18813 
01-03 18:24:08.889: E/AndroidRuntime(18813): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.AMOV.mr.fit/com.AMOV.mr.fit.ListaExerciciosActivity}: android.os.BadParcelableException: Parcelable protocol requires a Parcelable.Creator object called CREATOR on class com.AMOV.mr.fit.GrupoMuscular 
01-03 18:24:08.889: E/AndroidRuntime(18813): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2215) 
01-03 18:24:08.889: E/AndroidRuntime(18813): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2265) 
01-03 18:24:08.889: E/AndroidRuntime(18813): at android.app.ActivityThread.access$800(ActivityThread.java:145) 
01-03 18:24:08.889: E/AndroidRuntime(18813): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1206) 
01-03 18:24:08.889: E/AndroidRuntime(18813): at android.os.Handler.dispatchMessage(Handler.java:102) 
01-03 18:24:08.889: E/AndroidRuntime(18813): at android.os.Looper.loop(Looper.java:136) 
01-03 18:24:08.889: E/AndroidRuntime(18813): at android.app.ActivityThread.main(ActivityThread.java:5144) 
01-03 18:24:08.889: E/AndroidRuntime(18813): at java.lang.reflect.Method.invokeNative(Native Method) 
01-03 18:24:08.889: E/AndroidRuntime(18813): at java.lang.reflect.Method.invoke(Method.java:515) 
01-03 18:24:08.889: E/AndroidRuntime(18813): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789) 
01-03 18:24:08.889: E/AndroidRuntime(18813): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:605) 
01-03 18:24:08.889: E/AndroidRuntime(18813): at dalvik.system.NativeStart.main(Native Method) 
01-03 18:24:08.889: E/AndroidRuntime(18813): Caused by: android.os.BadParcelableException: Parcelable protocol requires a Parcelable.Creator object called CREATOR on class com.AMOV.mr.fit.GrupoMuscular 
01-03 18:24:08.889: E/AndroidRuntime(18813): at android.os.Parcel.readParcelableCreator(Parcel.java:2156) 
01-03 18:24:08.889: E/AndroidRuntime(18813): at android.os.Parcel.readParcelable(Parcel.java:2097) 
01-03 18:24:08.889: E/AndroidRuntime(18813): at android.os.Parcel.readValue(Parcel.java:2013) 
01-03 18:24:08.889: E/AndroidRuntime(18813): at android.os.Parcel.readListInternal(Parcel.java:2343) 
01-03 18:24:08.889: E/AndroidRuntime(18813): at android.os.Parcel.readArrayList(Parcel.java:1703) 
01-03 18:24:08.889: E/AndroidRuntime(18813): at android.os.Parcel.readValue(Parcel.java:2034) 
01-03 18:24:08.889: E/AndroidRuntime(18813): at android.os.Parcel.readArrayMapInternal(Parcel.java:2314) 
01-03 18:24:08.889: E/AndroidRuntime(18813): at android.os.Bundle.unparcel(Bundle.java:249) 
01-03 18:24:08.889: E/AndroidRuntime(18813): at android.os.Bundle.getParcelableArrayList(Bundle.java:1250) 
01-03 18:24:08.889: E/AndroidRuntime(18813): at android.content.Intent.getParcelableArrayListExtra(Intent.java:4729) 
01-03 18:24:08.889: E/AndroidRuntime(18813): at com.AMOV.mr.fit.ListaExerciciosActivity.onCreate(ListaExerciciosActivity.java:27) 
01-03 18:24:08.889: E/AndroidRuntime(18813): at android.app.Activity.performCreate(Activity.java:5231) 
01-03 18:24:08.889: E/AndroidRuntime(18813): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087) 
01-03 18:24:08.889: E/AndroidRuntime(18813): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2169) 
+1

Ошибка указывает на то, что вам не хватает: * Посылочный протокол требует объекта Parcelable.Creator, называемого CREATOR, на классе com.AMOV.mr.fit.GrupoMuscular * – Marko

+1

В вашей stacktrace указано, что именно не так - 'Parcelable protocol требует Parcelable . Объект создания называется CREATOR на классе com.AMOV.mr.fit.GrupoMuscular' –

+0

@MikeM. вы правы, но я не знаю, как я могу применить его к моему проекту. –

ответ

1

Ваш класс отсутствует СОЗДАТЕЛЬ:

Класс реализации Parcelable интерфейс должен также иметь статическое поле, называемое СОЗДАТЕЛЬ, который является объектом, реализующим интерфейс Parcelable.Creator.

public static final Parcelable.Creator<GrupoMuscular> CREATOR 
     = new Parcelable.Creator<GrupoMuscular>() { 
    public GrupoMuscular createFromParcel(Parcel in) { 
     return new GrupoMuscular(in); 
    } 

    public GrupoMuscular[] newArray(int size) { 
     return new GrupoMuscular[size]; 
    } 
}; 

Надеюсь, что эта помощь!

+0

Вот что я пропустил! Спасибо @Xingchen, это очень помогло! –

1

Вы не сделать свой класс Parcerable правильно - Ваш метод writeToParcel пуст, и Вы не создать CREATOR объект. Действительно простой пример реализации Parcerable интерфейс описан на разработчиков Android:

http://developer.android.com/reference/android/os/Parcelable.html

Чем проще способ отправить объект пользовательского класса на другой вид деятельности использует Serializable интерфейс - Ваш класс имеет только реализовать его и всю работу готово.

intent = new Intent(ExerciciosActivity.this, ListaExerciciosActivity.class); 
Bundle bundle = new Bundle(); 
bundle.putSerializable("gruposMusculares", gruposMusculares); 
intent.putExtras(bundle); 
startActivity(intent); 

Обратите внимание, что отправка объектов на Serializable немного медленнее, чем Parcerable и что все объекты классов, содержащихся в классе реализации Serializable должны реализовывать Serializable тоже.

+0

Я понятия не имел, что я возможно, с тем же использованием этого метода! Благодаря! –

Смежные вопросы