getItem() 如何在 android 开发人员的示例通用音乐播放器应用程序中真正发挥作用?
How does getItem() really work in android developer's sample universal music player app?
我想在这里了解android提供的通用音乐播放器的源代码:https://github.com/googlesamples/android-UniversalMusicPlayer
但是,我不明白他们如何使用浏览器适配器来使用 MediaItem 填充列表。部分代码在这里:
private static class BrowseAdapter extends ArrayAdapter<MediaBrowser.MediaItem> {
public BrowseAdapter(Activity context) {
super(context, R.layout.media_list_item, new ArrayList<MediaBrowser.MediaItem>());
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
MediaBrowser.MediaItem item = getItem(position);
System.out.println("Item: "+item);
int itemState = MediaItemViewHolder.STATE_NONE;
if (item.isPlayable()) {
itemState = MediaItemViewHolder.STATE_PLAYABLE;
MediaController controller = ((Activity) getContext()).getMediaController();
if (controller != null && controller.getMetadata() != null) {
String currentPlaying = controller.getMetadata().getDescription().getMediaId();
String musicId = MediaIDHelper.extractMusicIDFromMediaID(
item.getDescription().getMediaId());
if (currentPlaying != null && currentPlaying.equals(musicId)) {
PlaybackState pbState = controller.getPlaybackState();
if (pbState == null || pbState.getState() == PlaybackState.STATE_ERROR) {
itemState = MediaItemViewHolder.STATE_NONE;
} else if (pbState.getState() == PlaybackState.STATE_PLAYING) {
itemState = MediaItemViewHolder.STATE_PLAYING;
} else {
itemState = MediaItemViewHolder.STATE_PAUSED;
}
}
}
}
return MediaItemViewHolder.setupView((Activity) getContext(), convertView, parent,
item.getDescription(), itemState);
}
}
在 getView 的第一行,getItem() 是如何知道要查找哪个 list/array 来检索指定 'position' 处的数据的?通常对于列表适配器,我们传入一个数组,其中已经有元素,但在这个例子中,他们创建了一个新的 ArrayList,所以它应该是 empty.So getItem() 如何从一个空的 ArrayList 中检索?还是从其他地方检索 MediaItem?
谢谢。
BrowseAdapter 的构造函数调用父构造函数 (see ArrayAdapter.java lines 154-164). The parent constructor creates a list of items (see lines 175-182)。
项目被添加到适配器,适配器将它们添加到列表 (MediaBrowserFragment lines 119-121). getItem(int position)
then returns the item in the list (see 343-345)。
我想在这里了解android提供的通用音乐播放器的源代码:https://github.com/googlesamples/android-UniversalMusicPlayer
但是,我不明白他们如何使用浏览器适配器来使用 MediaItem 填充列表。部分代码在这里:
private static class BrowseAdapter extends ArrayAdapter<MediaBrowser.MediaItem> {
public BrowseAdapter(Activity context) {
super(context, R.layout.media_list_item, new ArrayList<MediaBrowser.MediaItem>());
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
MediaBrowser.MediaItem item = getItem(position);
System.out.println("Item: "+item);
int itemState = MediaItemViewHolder.STATE_NONE;
if (item.isPlayable()) {
itemState = MediaItemViewHolder.STATE_PLAYABLE;
MediaController controller = ((Activity) getContext()).getMediaController();
if (controller != null && controller.getMetadata() != null) {
String currentPlaying = controller.getMetadata().getDescription().getMediaId();
String musicId = MediaIDHelper.extractMusicIDFromMediaID(
item.getDescription().getMediaId());
if (currentPlaying != null && currentPlaying.equals(musicId)) {
PlaybackState pbState = controller.getPlaybackState();
if (pbState == null || pbState.getState() == PlaybackState.STATE_ERROR) {
itemState = MediaItemViewHolder.STATE_NONE;
} else if (pbState.getState() == PlaybackState.STATE_PLAYING) {
itemState = MediaItemViewHolder.STATE_PLAYING;
} else {
itemState = MediaItemViewHolder.STATE_PAUSED;
}
}
}
}
return MediaItemViewHolder.setupView((Activity) getContext(), convertView, parent,
item.getDescription(), itemState);
}
}
在 getView 的第一行,getItem() 是如何知道要查找哪个 list/array 来检索指定 'position' 处的数据的?通常对于列表适配器,我们传入一个数组,其中已经有元素,但在这个例子中,他们创建了一个新的 ArrayList,所以它应该是 empty.So getItem() 如何从一个空的 ArrayList 中检索?还是从其他地方检索 MediaItem?
谢谢。
BrowseAdapter 的构造函数调用父构造函数 (see ArrayAdapter.java lines 154-164). The parent constructor creates a list of items (see lines 175-182)。
项目被添加到适配器,适配器将它们添加到列表 (MediaBrowserFragment lines 119-121). getItem(int position)
then returns the item in the list (see 343-345)。