2015-12-26 3 views
2

У меня есть класс PlaylistJava, Android: ClassCastException после Intent

public class Playlist extends ArrayList<Track> implements Serializable { 

    String module; 
    String name, playlistId; 

    public Playlist(String name) { 
     super(); 
     this.name = name; 
    } 
    ... 
} 

и я стараюсь, чтобы дать его Intent с:

... 
Intent intent = new Intent(this, PlaylistActivity.class); 
intent.putExtra("playlist", Modul.loaded[id].getPlaylist(pId)); //Return Playlist 
startActivity(intent); 

И когда я пытаюсь получить список воспроизведения с:

Intent intent = getIntent(); 
playlist = (Playlist) intent.getSerializableExtra("playlist"); 

И вот я получаю эту ошибку:

Caused by: java.lang.ClassCastException: java.util.ArrayList cannot be cast to com.timia2109.nukla.Playlist 

Но это должен быть плейлист, потому что я создаю его как плейлист, и я не буду передавать его в Serializable с намерением. Я не нашел решение в Интернете, но ничего не нашел.

Или есть способ сделать это:

PlaylistActivity pa = new PlaylistActivity(); 
pa.setPlaylist(playlist); 
//And now start this Activity 

Спасибо!

ответ

1

Связанный с этим old bug который сейчас обозначен как устаревший. Я не знаю, все еще проблема. Самое простое решение, хотя, конечно, вручную обрабатывать (ре) создание вашего объекта

идеал начать с изменения вашей реализации в Parcelable что-то вроде следующего, который похож на что-то я использовал в прошлом

public static class Playlist extends ArrayList<Track> implements Parcelable { 

    String module; 
    String name, playlistId; 

    public Playlist(String name) { 
     super(); 
     this.name = name; 
    } 

    protected Playlist(Parcel in) { 
     module = in.readString(); 
     name = in.readString(); 
     playlistId = in.readString(); 
     //this line you might need to tweak & error handle, I've jsut written this from memory 
     super.addAll((Collection<? extends Track>) Arrays.asList(in.readParcelableArray(Track.class.getClassLoader()))); 
    } 

    @Override 
    public int describeContents() { 
     return 0; 
    } 

    @Override 
    public void writeToParcel(Parcel dest, int flags) { 
     dest.writeString(module); 
     dest.writeString(name); 
     dest.writeString(playlistId); 
     dest.writeParcelableArray(toArray(new Track[size()]), flags); 
    } 

    public static final Creator<Playlist> CREATOR = new Creator<Playlist>() { 
     @Override 
     public Playlist createFromParcel(Parcel in) { 
      return new Playlist(in); 
     } 

     @Override 
     public Playlist[] newArray(int size) { 
      return new Playlist[size]; 
     } 
    }; 

} 

причины предпочитая parcelable являются explained well here

Ваша принимающая деятельность должна обращаться с parcelable лучше. Если вы решили сделать ваш объект Parcelable или вы не можете обрабатывать отдых самостоятельно нравится следующим

public static class Playlist ... { 

    public Playlist(ArrayList<Track> arrList) { 
     super(arrList); 
    } 

    .... 
} 

и используя

Intent intent = getIntent(); 
ArrayList<Track> arrList = (ArrayList<Track>) intent.getSerializableExtra("playlist"); 
playlist = new Playlist(arrList); 

Вам просто нужно изменить его для этих двух дополнительных полей, которые имеют и следует помнить, что при попытке записать его намерения он может пожаловаться дженериков, так просто вручную приведение к parcelable/сериализации, когда вы установите дополнительно:

intent.putExtra("playlist", (Parcelable) Modul.loaded[id].getPlaylist(pId)); 
+0

Спасибо! Это работает :) Но я получаю только это: защищенный плейлист (Parcel in) { module = in.readString(); name = in.readString(); playlistId = in.readString(); // этой строке вам может потребоваться настроить и обработать ошибку, я написал это из памяти Список load = Arrays.asList (in.readParcelableArray (Track.class.getClassLoader())); for (int i = 0; i timia2109

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