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:
- ¿Cómo desplazar el RecyclerView de forma programática por unos píxeles específicos?
- Android RecyclerView con SectionIndexer
- Recyclerview automáticamente se desplaza hacia arriba cuando los datos insertados
- El trabajo de CollapsingTolbar con fagment contiene SwipeRefreshLayout y RecycleView
- RecyclerView.ViewHolder - getLayoutPosition vs getAdapterPosition
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); } }
- Cómo inhabilitar el dibujo de la decoración del artículo de RecyclerView para la duración de las animaciones del artículo
- Función de conversación de RecyclerView no bien
- RecyclerView encabezado y pie de página
- ¿Número múltiple de columnas en un único StaggeredGridView?
- ¿Por qué OnClickListener en un ViewHolder no funciona?
- Cómo refundir elementos en un RecyclerView con el StaggeredGridLayoutManager
- ¿No puede actualizar RecyclerView desde mi clase de modelo?
- La lista de arreglos de Android RecyclerView cambia dinámicamente
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();
- La mejor manera de posicionar la imagen en el mismo lugar en todos los dispositivos?
- ¿Tiene Android alguna API que proporcione fecha-hora como entrada del usuario (startActivityForResult)?