YouTubePlayerFragment внутри ReyclerView

У меня есть RecyclerView с CardViews внутри него. Я хочу, чтобы у каждого CardView был свой собственный YouTubePlayerFragment. Даже если все они не могут быть активны одновременно, я даже не могу создать экземпляр YouTubePlayerFragment в любом CardView, кроме первого в 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"/>

Вьюхолдер:

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

}

person Flyview    schedule 06.11.2015    source источник
comment
Где находится пользовательский интерфейс YoutubePlayerFragment?   -  person Mina F. Beshay    schedule 06.09.2017
comment
@MinaF.Beshay Он встроен в YouTubePlayFragment, предоставленный библиотекой.   -  person Flyview    schedule 16.09.2017
comment
ОК, но я получаю исключение java.lang.IllegalArgumentException: не найдено представление для идентификатора 0x2 (неизвестно) для фрагмента YouTubePlayerFragment   -  person Mina F. Beshay    schedule 17.09.2017
comment
@MinaF.Beshay Вам также нужно поместить YouTubePlayerFragment в свой макет, вы это сделали?   -  person Flyview    schedule 28.09.2017
comment
Мне нужно было поместить макет фрагмента в RecyclerView, что невозможно.   -  person Mina F. Beshay    schedule 28.09.2017


Ответы (1)


Итак, я понял это. Пока вы устанавливаете уникальный идентификатор для YouTube FrameLayout, активность будет правильно вставлять фрагмент в нужную карточку! Вы можете setId() для представления во время выполнения, поэтому просто убедитесь, что они каким-то образом уникальны друг от друга.

   // 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();
person Flyview    schedule 06.11.2015
comment
как вы решили проблему? Не могли бы вы поделиться кодом. Я попытался установить идентификатор макета держателя фрагмента Youtube уникальным, но все же первый фрагмент в recyclerview загружается отлично, и когда я начинаю прокручивать, все представления перепутались. - person aman.nepid; 10.05.2016
comment
@Flyview Где вы разместили код? Я получил ошибку, не могу найти идентификатор ресурса, независимо от того, размещаю ли я его до или после транзакции диспетчера фрагментов. - person Dark Leonhart; 06.12.2016
comment
@DarkLeonhart Я делаю это перед транзакцией фрагмента. Я обновил свой ответ дополнительным кодом. - person Flyview; 06.12.2016
comment
Что такое обоиИнформация? Это представление родительского фрагмента? - person Ivan Leong; 12.05.2017
comment
@IvanLeong Вроде того. Это пользовательский объект, содержащий некоторую элементарную информацию. Однако он содержит фрагмент проигрывателя YouTube и контейнер (представление), как вы можете видеть. - person Flyview; 13.05.2017
comment
Но чему соответствует идентификатор wallpaperInfo? - person Ivan Leong; 15.05.2017
comment
@IvanLeong Вы видите проприетарный код для конкретного вопроса. На имена переменных лучше не обращать внимания. - person Abandoned Cart; 09.03.2020