RecyclerView 中的 YouTubePlayerFragment

Posted

技术标签:

【中文标题】RecyclerView 中的 YouTubePlayerFragment【英文标题】:YouTubePlayerFragment inside ReyclerView 【发布时间】:2016-02-07 03:06:20 【问题描述】:

我有一个 RecyclerView,里面有 CardViews。我希望每个 CardView 都有自己的 YouTubePlayerFragment。即使它们不能同时全部激活,我什至无法在任何 CardView 中实例化 YouTubePlayerFragment,但 RecyclerView 中的第一个。当点击卡片上应该设置 YouTubePlayerFragment 的按钮时,它总是将其设置在第一张卡片上,即使我点击了第二张卡片。我正在尝试做的事情可能吗?

以下是代码的相关部分:

CardView XML 中的片段持有者:(直接在 xml 中使用片段会导致二进制 XML 异常,可能是由于片段中的片段在沿线某处)

<FrameLayout
        android:id="@+id/youtube_holder"
        android:layout_
        android:layout_
        android:layout_alignParentTop="true"
        android:layout_alignLeft="@+id/layout_video_thumbnail"
        android:layout_alignStart="@+id/layout_video_thumbnail"
        android:layout_alignRight="@+id/layout_video_thumbnail"
        android:layout_alignEnd="@+id/layout_video_thumbnail"
        android:visibility="visible"/>

ViewHolder:

public class VideoViewHolder extends RecyclerView.ViewHolder 

protected FrameLayout containerYouTubePlayer;
protected TextView textViewTitle;
protected ImageView imageViewThumbNail;
protected Button buttonPreview, buttonSet;
protected Context activityContext;

public VideoViewHolder(Context activityContext, View itemView) 
    super(itemView);

    this.activityContext = activityContext;
    containerYouTubePlayer = (FrameLayout) itemView.findViewById(R.id.youtube_holder);
    textViewTitle = (TextView) itemView.findViewById(R.id.textView_title);
    imageViewThumbNail = (ImageView) itemView.findViewById(R.id.imageView_video_thumbnail);
    buttonPreview = (Button) itemView.findViewById(R.id.button_preview);
    buttonSet = (Button) itemView.findViewById(R.id.button_set);


RecyclerView 适配器:

public class VideoCardAdapter extends RecyclerView.Adapter<VideoViewHolder> 

private static final String TAG = "VidWall.VideoCardAdapter";
private List<VideoInfo> videoList;
private Context activityContext;

public VideoCardAdapter(Context activityContext, List<VideoInfo> videoList) 
    this.activityContext = activityContext;
    this.videoList = videoList;


@Override
public int getItemCount() 
    return videoList.size();


@Override
public void onBindViewHolder(final VideoViewHolder videoViewHolder, int i) 
    final VideoInfo videoInfo = videoList.get(i);
    videoViewHolder.textViewTitle.setText(videoInfo.displayName);
    videoViewHolder.imageViewThumbNail.setImageDrawable(ContextCompat.getDrawable(activityContext, activityContext.getResources().getIdentifier(videoInfo.fileNameThumbnail, "drawable", activityContext.getPackageName())));
    videoViewHolder.buttonPreview.setOnClickListener(new View.OnClickListener() 
        @Override
        public void onClick(View v) 
            Utils.logDebug(TAG, "buttonPreview clicked");

            // Add the YouTube fragment to view
            final YouTubePlayerFragment youTubePlayerFragment = YouTubePlayerFragment.newInstance();
            ((Activity) activityContext).getFragmentManager().beginTransaction().replace(videoViewHolder.containerYouTubePlayer.getId(), youTubePlayerFragment).commit();
            youTubePlayerFragment.initialize(WallpapersActivity.Y_KEY, new YouTubePlayer.OnInitializedListener() 
                @Override
                public void onInitializationSuccess(YouTubePlayer.Provider provider, final YouTubePlayer youTubePlayer, boolean b) 
                    Utils.logDebug(TAG, "onInitializationSuccess");

                    youTubePlayer.cueVideo("xxxxxxxx");
                    youTubePlayer.setShowFullscreenButton(false);
                

                @Override
                public void onInitializationFailure(YouTubePlayer.Provider provider, YouTubeInitializationResult youTubeInitializationResult) 
                    Utils.logError(TAG, "Could not initialize YouTubePlayer");
                
            );

            videoViewHolder.containerYouTubePlayer.setVisibility(View.VISIBLE);
        
    );



@Override
public VideoViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) 

    View itemView = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.layout_wallpaper_card, viewGroup, false);

    return new VideoViewHolder(activityContext, itemView);



【问题讨论】:

YoutubePlayerFragment 的 UI 在哪里? @MinaF.Beshay 它内置在库提供的 YouTubePlayFragment 中。 好的,但我得到一个异常 java.lang.IllegalArgumentException: No view found for id 0x2 (unknown) for fragment YouTubePlayerFragment @MinaF.Beshay 您还必须在布局中放置 YouTubePlayerFragment,您这样做了吗? 我需要将片段布局放在 RecyclerView 中,这是不可能的。 【参考方案1】:

所以我想通了。只要为 YouTube FrameLayout 设置一个唯一的 id,activity 就会正确地将片段插入到正确的卡片上!您可以在运行时在视图上设置 ID(),因此只需确保它们彼此之间是独一无二的。

   // Add the YouTube fragment to view
   wallpaperInfo.youTubePlayerFragment = YouTubePlayerFragment.newInstance();
   // Must set a unique id to the framelayout holding the fragment or else it's always added to the first item in the recyclerView (the first card)
   videoViewHolder.containerYouTubePlayer.setId(wallpaperInfo.id);
   ((Activity) activityContext).getFragmentManager().beginTransaction().add(videoViewHolder.containerYouTubePlayer.getId(), wallpaperInfo.youTubePlayerFragment).addToBackStack(null).commit();

【讨论】:

你是如何解决这个问题的?你能分享一些代码吗?我尝试将 Youtube Fragment holder layouts ID 设置为唯一,但 recyclerview 中的第一个片段仍然可以完美加载,当我开始滚动时,所有视图都搞砸了。 @Flyview 你把代码放在哪里了?无论我将它放在片段管理器事务之前还是之后,我都会收到错误“找不到资源 id”。 @DarkLeonhart 我在片段交易之前做。我用更多代码更新了我的答案。 @IvanLeong 有点像。这是一个包含一些基本信息的自定义对象。但是,如您所见,它包含 youtube playerfragment 和容器(视图)。 @IvanLeong 您正在看到针对特定问题的高度专有代码。最好忽略变量名。

以上是关于RecyclerView 中的 YouTubePlayerFragment的主要内容,如果未能解决你的问题,请参考以下文章

在recyclerview的嵌套recyclerview中的嵌套列表中添加项目

RecyclerView | 处理 RecyclerView 中的点击事件

Kotlin - Recyclerview 分页中的问题

AndroidStudio-添加RecyclerView包 AndroidStudio添加v7包中的RecyclerView

如何从其他recyclerview接收recyclerview中的数据?

更新片段中的 RecyclerView