谷歌已经发布了谷歌的YouTube API。该API中有一个YouTubeThumbnailView,用于显示电影的缩略图。
我想在ListView中显示缩略图。我已经制作了一个适配器来制作 View 。但是我不确定该如何处理。

在我的ListView适配器的getView中,为包含YouTubeThumbnailView的布局充气。根据文档(https://developers.google.com/youtube/android/player/reference/com/google/android/youtube/player/YouTubeThumbnailView),我应该调用initialize方法。

我想知道是否需要一次调用initialize方法,或者如果 View 被ListView重用,也要调用此方法吗?无法检查YouTubeThumbnailView是否已初始化?所以我想我应该多次调用它。但是我不知道是否允许?

最佳答案

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

  • 该 View 是新 View ,需要初始化。
  • 该 View 已经初始化,并且我们对加载器有引用。
  • 该 View 当前正在初始化。

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

    示例代码:
    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);
      }
    

    10-06 13:54