8

Mam RecyclerView z CardViews w środku. Chcę, aby każdy CardView miał swój własny YouTubePlayerFragment. Nawet jeśli nie wszystkie mogą być aktywne od razu, nie mogę nawet utworzyć instancji YouTubePlayerFragment w żadnym CardView, ale pierwszy w RecyclerView. Kliknięcie przycisku na karcie, która ma skonfigurować YouTubePlayerFragment, zawsze ustawia ją na pierwszej karcie, nawet jeśli kliknąłem drugą kartę. Czy to, co próbuję zrobić, to możliwe?YouTubePlayerFragment wewnątrz ReyclerView

Oto odpowiednie fragmenty kodu:

Uchwyt do fragmentu w CardView XML: (stosując fragment bezpośrednio w XML został dając binarny wyjątek XML, prawdopodobnie z powodu fragmentu w obrębie fragmentu gdzieś wzdłuż linii)

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 Adapter:

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

Gdzie jest interfejs użytkownika YoutubePlayerFragment? –

+0

@ MinaF.Beshay Jest wbudowany w YouTubePlayFragment zgodnie z biblioteką. – Flyview

+0

OK, ale otrzymuję wyjątek java.lang.IllegalArgumentException: Nie znaleziono widoku dla id 0x2 (nieznany) dla fragmentu YouTubePlayerFragment –

Odpowiedz

8

Więc zdobione. Tak długo, jak ustawisz unikalny identyfikator w YouTube FrameLayout, działanie będzie poprawnie wstawiać fragment na właściwej karcie! Możesz ustawićInd() na widoku w czasie wykonywania, więc upewnij się, że są one w jakiś sposób unikalne.

// 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(); 
+0

w jaki sposób rozwiązałeś problem? Czy możesz podzielić się jakimś kodem? Próbowałem ustawić unikalny identyfikator układu uchwytów fragmentów Youtube, ale wciąż pierwszy fragment w widoku recyclerview ładuje się idealnie, a kiedy zaczynam przewijanie, wszystkie widoki są pomieszane. –

+0

Kod dodany w odpowiedzi @ aman.nepid – Flyview

+0

@ Flyview Gdzie umieściłeś kod? Mam błąd "nie mogę znaleźć identyfikatora zasobu", niezależnie od tego, czy umieściłem go przed transakcją fragmentów, czy po niej. –

Powiązane problemy