ReyclerView中的YouTubePlayerFragment

里面有一个带有CardView的RecyclerView。 我希望每个CardView都有自己的YouTubePlayerFragment。 即使他们不能立刻全部活跃起来,我似乎甚至不能在任何CardView中实例化YouTubePlayerFragment,而是在RecyclerView中实例化第一个。 当点击应该设置YouTubePlayerFragment的卡片上的button时,即使我点击了第二张卡片,它也会将其设置在第一张卡片上。 我正在尝试做什么?

以下是代码的相关部分:

CardView XML中片段的持有者:(直接在xml中使用片段会产生二进制XMLexception,可能是由于片段内某个片段内的片段)

<FrameLayout android:id="@+id/youtube_holder" android:layout_width="match_parent" android:layout_height="match_parent" 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); } } 

Solutions Collecting From Web of "ReyclerView中的YouTubePlayerFragment"

所以我明白了。 只要您为YouTube FrameLayout设置了唯一的ID,该活动就会正确地将片段插入到正确的卡片上! 你可以在运行时在View上设置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();