YouTubePlayerFragment dentro de ReyclerView

Tengo un RecyclerView con CardViews dentro de él. Quiero que cada CardView tenga su propio YouTubePlayerFragment. Incluso si no todos pueden estar activos al mismo tiempo, ni siquiera puedo imaginar el YouTubePlayerFragment en cualquier CardView, pero el primero en el RecyclerView. Al hacer clic en el botón de la tarjeta que se supone para configurar el YouTubePlayerFragment, siempre lo configura en la primera tarjeta, incluso si he hecho clic en la segunda tarjeta. ¿Es lo que estoy tratando de hacer posible?

Aquí están las partes relevantes del código:

Titular del fragmento en CardView XML: (usar fragmento directamente en xml estaba dando una excepción XML binaria, probablemente debido a un fragmento dentro de un fragmento en algún lugar a lo largo de la línea)

<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); } } 

Adaptador 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); } } 

Así que me di cuenta. Siempre que establezca un identificador único para YouTube FrameLayout, la actividad insertará correctamente el fragmento en la tarjeta correcta. Usted puede setId () en una Vista en tiempo de ejecución tan sólo asegúrese de que son de alguna manera único de la otra.

  // 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(); 
  • Android agrega espaciado debajo del último elemento en recyclerview con gridlayoutmanager
  • Población animada de RecyclerView
  • ¿Cómo puedo hacer que WRAP_CONTENT funcione en un RecyclerView
  • RecyclerView.onBindViewHolder sólo se llama una vez
  • ¿Cómo agregar un simple encabezado 8dp / pie de página a RecyclerView de Android?
  • Fragmento dinámico de Android Google Maps en el soporte de RecyclerView
  • RecyclerView notifyDataSetChanged no funciona después de la consulta de análisis
  • Múltiples elementos seleccionados RecyclerView in Activity.java
  • Recyclerview y manejo de diferentes tipos de hilera de inflación
  • ¿Hay alguna manera recomendada de crear un id para un ParseObject para usar en un RecyclerView?
  • cómo clasificar los datos en RecyclerView
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.