7

Google 已经发布了适用于 Google 的 YouTube api。在那个 api 中是一个 YouTubeThumbnailView 来显示电影的缩略图。我想在 ListView 中显示缩略图。我制作了一个适配器来制作视图。但我不确定如何处理这个问题。

在我的 ListView 适配器的 getView 中,我膨胀了一个包含 YouTubeThumbnailView 的布局。根据文档(https://developers.google.com/youtube/android/player/reference/com/google/android/youtube/player/YouTubeThumbnailView),我应该调用初始化方法。

我想知道我是否需要调用一次初始化方法,或者如果视图被 ListView 重用,也调用这个方法?没有办法检查 YouTubeThumbnailView 是否已经初始化?所以我想我应该多次调用它。但我不知道这是否允许?

4

1 回答 1

17

您应该只调用一次,但在初始化后保存对加载程序的引用。解决此问题的一种方法是保留从View到的地图YouTubeThumbnailLoader。中getView,有 3 种情况:

  1. 视图是新的,需要初始化。
  2. 视图已经初始化,我们有一个对加载器的引用。
  3. 视图当前正在初始化。

在情况 1 和 3 中,您需要记住加载程序在初始化时应该执行的操作。例如,您可以将视频 ID 保存在视图的标签中。

示例代码:

Map<View, YouTubeThumbnailLoader> loaders;

@Override
public View getView(int position, View convertView, ViewGroup parent) {
  View view = convertView;
  String videoId = getVideoId(position);

  if (view == null) {
    // Case 1 - We need to initialize the loader
    view = inflater.inflate(..., parent, false);
    YouTubeThumbnailView thumbnail = (YouTubeThumbnailView) view.findViewById(R.id.thumbnail);
    thumbnail.setTag(videoId);
    thumbnail.initialize(DeveloperKey.DEVELOPER_KEY, thumbnailListener);
  } else {
    YouTubeThumbnailView thumbnail = (YouTubeThumbnailView) view.findViewById(R.id.thumbnail);
    YouTubeThumbnailLoader loader = loaders.get(thumbnail);
    if (loader == null) {
      // Case 3 - The loader is currently initializing
      thumbnail.setTag(videoId);
    } else {
      // Case 2 - The loader is already initialized
      thumbnail.setImageResource(R.drawable.loading_thumbnail);
      loader.setVideo(videoId);
    }
  }
  return view;
}

在你的 thumbnailListener 中:

  @Override
  public void onInitializationSuccess(YouTubeThumbnailView view, YouTubeThumbnailLoader loader) {
    String videoId = (String) view.getTag();
    loaders.put(view, loader);
    view.setImageResource(R.drawable.loading_thumbnail);
    loader.setVideo(videoId);
  }
于 2012-12-27T11:23:52.697 回答