问题描述
我有一个带有CardViews的RecyclerView.我希望每个CardView都有自己的YouTubePlayerFragment.即使不能一次全部激活它们,我什至似乎都无法在任何CardView中实例化YouTubePlayerFragment,而在RecyclerView中却是第一个实例化.单击本应设置YouTubePlayerFragment的卡上的按钮时,即使我单击了第二张卡,它也始终在第一张卡上进行设置.我想做的事有可能吗?
I have a RecyclerView with CardViews inside it. I want each CardView to have its own YouTubePlayerFragment. Even if they can't all be active at once, I can't even seem to instantiate the YouTubePlayerFragment in any CardView but the first in the RecyclerView. When clicking the button on the card that's supposed to set up the YouTubePlayerFragment, it always sets it up on the first card, even if I've clicked the second card. Is what I'm trying to do possible?
以下是代码的相关部分:
Here are the relevant parts of code:
CardView XML中的片段的持有人:(直接在xml中使用片段会产生二进制XML异常,这可能是因为片段中的片段位于行中某处)
Holder for the fragment in CardView XML: (using fragment directly in xml was giving binary XML exception, probably due to fragment within a fragment somewhere along the line)
<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);
}
}
推荐答案
所以我知道了.只要您为YouTube FrameLayout设置了唯一的ID,该活动就会在正确的卡片上正确插入片段!您可以在运行时在View上设置setId(),因此只需确保它们在某种程度上是唯一的即可.
So I figured it out. As long as you set a unique id for the YouTube FrameLayout, the activity will correctly insert the fragment on the right card! You can setId() on a View at runtime so just make sure they are somehow unique from one another.
// 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();
这篇关于ReyclerView内的YouTubePlayerFragment的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!