ArrayList中的混合Parcelable数据类型作为额外功能

时间:2018-07-11 23:04:08

标签: java android arraylist parcelable

我有一个“播放列表”,类型为“ ArrayList”。在我的代码中遍历此列表时,我可以轻松地检查它是否是Song,专辑,Artist,Genre的instance,并转换为正确的类型。所有类型都在android中实现了Parcelable,因此可以将它们从一个活动发送到另一个活动,但是在尝试通过广播接收器发送“播放列表”时遇到了问题。基本上,一首歌曲结束后,它将继续进行下一个项目。该项目可能是专辑,艺术家或其他内容,我的应用程序知道如何处理它,但是我需要将该列表广播到我的MainActivity中,以便在单击按钮时向用户显示播放列表。问题是它们是混合类型,所以我不能只说...

'wagtail_serve'

我尝试执行“ ArrayList ...”,但抛出错误,指出错误的数据类型。如果我执行“ ArrayList ...”,一旦拥有它们,如何将它们恢复为正常对象? 传递的额外内容将是ArrayList,其中可以包含Song,专辑,Artist或Genre。我确信有办法做到这一点,我似乎无法弄清楚。我很乐意显示代码,该代码可以制作列表并在MusicService中处理列表(如果需要)。谢谢。

UDPATE。这是我用于商品和清单的代码...

歌曲..

private BroadcastReceiver playlistUpdated = new BroadcastReceiver() {
  @Override
  public void onReceive(Context context, Intent intent) {
    ArrayList<NOT SURE WHAT TO SAY HERE> tempList = intent.getParcelableArrayListExtra(MusicService.PLAY_LIST_EXTRA);
    //... do more processing to add them to the base activity playlist and show
  }
};

专辑,艺术家和流派几乎完全相同,只是专辑中可能有不同的键,例如专辑将有numSongs。

然后在我的MusicService中创建“播放列表”数组...

public class Song implements Parcelable {
  private long id;
  private String title;
  private String artist;
  private String album;
  private String albumArtURI;

  public Song(Parcel in) {
    this.id = in.readLong();
    this.title = in.readString();
    ...
  }
  //rest of class... getters setters, writeToParcel, and the CREATOR
}

getSongsFromAlbum或getAlbumsFromArtistWithoutAlbum的代码仅返回ArrayList或ArrayList。它使用ContentResolver来查询MediaStore.Audio。用于数据库中的媒体。像这样...

private ArrayList<Object> playlist = new ArrayList<>();
...
public void setPlayConfinedTo(Album album) {
  this.album = album;
  playlist.addAll(getSongsFromAlbum(album.getId());
}

public void setPlayConfinedTo(Album album, Artist artist) {
  this.artist = artist;
  this.album = album;
  playlist.addAll(getSongsFromAlbum(album.getId());
  ArrayList<Album> remainingAlbums = getAlbumsFromArtistWithoutAlbum(artist.getId(), album.getId());
  if(remainingAlbums.size() > 0) {
    playlist.addAll(remainingAlbums);
  }
}

所以最后我有了一个ArrayList,其中可以将Album,Artist,Song或Genre作为对象。

0 个答案:

没有答案