我有一个带有CardViews的RecyclerView。我希望每个CardView都有自己的YouTubePlayerFragment。即使它们不能同时处于活动状态,我甚至无法在任何CardView中实例化YouTubePlayerFragment,而是在RecyclerView中实现第一个。当点击卡上应该设置YouTubePlayerFragment的按钮时,它总是在第一张卡上设置,即使我点击了第二张卡。我正在尝试做什么?
以下是代码的相关部分:
持有CardView XML中的片段:(直接在xml中使用片段会产生二进制XML异常,可能是由于片段中某个片段内的片段)
<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);
}
}
答案 0 :(得分:10)
所以我明白了。只要您为YouTube FrameLayout设置了唯一ID,该活动就会在正确的卡片上正确插入片段!你可以在运行时在View上设置ifId(),这样就可以确保它们在某种程度上彼此独特。
// 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();