2013-12-24 5 views
1

В классе, который я пытаюсь сделать простым, существует меньший класс, называемый genericSongClass. В более крупном классе есть ArrayList genericSongClass. Поэтому я знаю, что я должен сделать genericSongClass доступным, но я не могу дать ему CREATOR, не делая класс статическим. Есть ли способ сделать это?Android: Как я могу создать класс, который реализует Parcelable, который содержит ArrayList нестатического настраиваемого класса.

Мой меньший класс, как он сейчас стоит в нынешней путанице:

public class genericSongClass implements Parcelable { 
     String songTitle = ""; 
     String songArtist = ""; 
     String songData = ""; 
     String songAlbum = ""; 
     String isChecked = "false"; 

     public final static Parcelable.Creator<genericSongClass> CREATOR = new Parcelable.Creator<genericSongClass>() { 

      @Override 
      public genericSongClass createFromParcel(Parcel source) { 
       return null; 
      } 

      @Override 
      public genericSongClass[] newArray(int size) { 
       return null; 
      } 

     }; 

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

     @Override 
     public void writeToParcel(Parcel dest, int flags) {    
     } 
} 

Мой Larger класс (все связанные parcelable методы находятся в нижней части и ArrayList и конструктор, используя пакет находится в верхней части):

public class Music implements Parcelable{ 

    private static ArrayList<genericSongClass> songs = null; 

    Cursor cursor; 

    Context context; 

    public Music(Context context){ 
     this.context = context; 
    } 

    public Music(Parcel in){ 
     songs = in.readArrayList(songs, genericSongClass.CREATOR); 
    } 

    public void BindAllSongs() {   
      /** Making custom drawable */ 
      String selection = MediaStore.Audio.Media.IS_MUSIC + " != 0"; 
      final String[] projection = new String[] { 
        MediaStore.Audio.Media.DISPLAY_NAME, 
        MediaStore.Audio.Media.ARTIST, 
        MediaStore.Audio.Media.DATA, 
        MediaStore.Audio.Media.ALBUM}; 
        final String sortOrder = MediaStore.Audio.AudioColumns.TITLE 
          + " COLLATE LOCALIZED ASC"; 

        try { 
         // the uri of the table that we want to query 
         Uri uri = android.provider.MediaStore.Audio.Media.EXTERNAL_CONTENT_URI; 
         // query the db 
         cursor = context.getContentResolver().query(uri, 
           projection, selection, null, sortOrder); 
         if (cursor != null) { 
          songs = new ArrayList<genericSongClass>(cursor.getCount()); 
          cursor.moveToFirst();      
          while (!cursor.isAfterLast()) { 
           genericSongClass GSC = new genericSongClass(); 
           GSC.songTitle = cursor.getString(0); 
           GSC.songArtist = cursor.getString(1); 
           GSC.songData = cursor.getString(2); 
           GSC.songAlbum = cursor.getString(3); 
           songs.add(GSC); 
           cursor.moveToNext(); 
          } 
         } 
        } catch (Exception ex) { 

        } finally { 
         if (cursor != null) { 
          cursor.close(); 
         } 
        }  

     } 

    public static Object[] toArray(ArrayList<Object> list){ 
     Object[] toReturn = new Object[list.size()]; 
     for (int i = 0; i < list.size(); i++){ 
      toReturn[i] = list.get(i); 
     } 
     return toReturn; 
    } 

    public ArrayList<String> getArtists(){ 
     ArrayList<String> artists = new ArrayList<String>(); 
     for(genericSongClass gsc: songs){ 
      if(!artists.contains(gsc.songArtist)){ 
       artists.add(gsc.songArtist); 
      } 
     } 
     Alphabetize forArtists = new Alphabetize(artists); 
     return forArtists.getSortedArrayList(); 
    } 

    public ArrayList<String> getAlbums(String artist){ 
     ArrayList<String> albums = new ArrayList<String>(); 
     for(genericSongClass gsc: songs){ 
      if(gsc.songArtist == artist){ 
       albums.add(gsc.songAlbum); 
      } 
     } 
     Alphabetize forAlbums = new Alphabetize(albums); 
     return forAlbums.getSortedArrayList(); 
    } 

    //--- Parcel ------------------------------------------------ 

    public static final Parcelable.Creator<Music> CREATOR = new Parcelable.Creator<Music>() { 

      public Music createFromParcel(Parcel in) { 
       return new Music(in); 
      } 

      @Override 
      public Music[] newArray(int size) { 
       return null; 
      } 
     }; 

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

    @Override 
    public void writeToParcel(Parcel dest, int flags) { 
     dest.writeList(songs); 
    } 



} 

Это мой первый попыток использовать Parcelable, поэтому любая помощь приветствуется! Заранее спасибо!

ответ

2

Прежде всего: рассмотрите следующие соглашения Java и переименуйте genericSongClass в GenericSong. В остальном это предполагает, что вы не изменили это имя.

Вторые от: прочитать это удивительное руководство при использовании/понимании Parcelables http://blog.logicexception.com/2012/09/a-parcelable-tutorial-for-android.html

Наконец: некоторые или все решений для вашего точного кода:

Добавить новый конструктор в genericSongClass:

public genericSongClass(Parcel in) { 
    songTitle = in.readString(); 
    // read in the rest of your values here 
} 

И добавить конструктор по умолчанию:

public genericSongClass() { 
} 

CREATOR в genericSongClass должен выглядеть следующим образом: (настроить Music класс а)

public final static Parcelable.Creator<genericSongClass> CREATOR = new Parcelable.Creator<genericSongClass>() { 

    @Override 
    public genericSongClass createFromParcel(Parcel source) { 
     return new genericSongClass(source); 
    } 

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

}; 

Отрегулировать writeToParcel метод:

@Override 
public void writeToParcel(Parcel dest, int flags) { 
    dest.writeString(songTitle); 
    // write your other values here 
} 

иметь в виду, что порядок ЭТО ВАЖНО! Чтения и записи должны быть в одном порядке!

В вашем Music конструктор класса:

in.readTypedList(songs, genericSongClass.CREATOR); 

В вашем Music классе writeToParcel:

dest.writeTypedList(songs); 
Смежные вопросы