8

Tôi có RecyclerView với CardView bên trong nó. Tôi muốn mỗi CardView có YouTubePlayerFragment riêng của mình. Ngay cả khi họ không thể hoạt động cùng một lúc, tôi thậm chí không thể tạo ra YouTubePlayerFragment trong bất kỳ CardView nào nhưng nó là phiên bản đầu tiên trong RecyclerView. Khi nhấp vào nút trên thẻ có nghĩa vụ thiết lập YouTubePlayerFragment, thẻ luôn đặt nó trên thẻ đầu tiên, ngay cả khi tôi đã nhấp vào thẻ thứ hai. Là những gì tôi đang cố gắng để làm có thể?YouTubePlayerFragment bên trong ReyclerView

Sau đây là các bộ phận liên quan của mã:

Chủ cho đoạn trong CardView XML: (sử dụng mảnh trực tiếp trong xml được đưa ra nhị phân ngoại lệ XML, có thể là do đoạn trong một đoạn ở đâu đó dọc theo dòng)

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

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

Giao diện người dùng của YoutubePlayerFragment ở đâu? –

+0

@ MinaF.Beshay Nó được tích hợp trong YouTubeFlayment như được cung cấp bởi thư viện. – Flyview

+0

OK nhưng tôi nhận được ngoại lệ java.lang.IllegalArgumentException: Không có chế độ xem nào cho id 0x2 (không xác định) cho đoạn YouTubePlayerFragment –

Trả lời

8

Vì vậy, tôi figured it out. Miễn là bạn đặt một id duy nhất cho YouTube FrameLayout, hoạt động sẽ chèn chính xác đoạn đó vào đúng thẻ! Bạn có thể setId() trên Chế độ xem lúc chạy, do đó, hãy đảm bảo chúng bằng cách nào đó độc đáo với nhau.

// 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

bạn đã giải quyết vấn đề như thế nào? Bạn có thể vui lòng chia sẻ một số mã. Tôi đã cố gắng thiết lập ID bố cục chủ sở hữu Fragment Youtube duy nhất, nhưng vẫn là mảnh đầu tiên trong recyclerview tải hoàn hảo và khi tôi bắt đầu cuộn tất cả các khung nhìn bị sai lệch. –

+0

Đã thêm mã trong câu trả lời @ aman.nepid – Flyview

+0

@Flyview Bạn đã đặt mã ở đâu? Tôi đã nhận được lỗi "không thể tìm thấy id tài nguyên", cho dù tôi đặt nó trước hoặc sau khi giao dịch quản lý phân đoạn. –

Các vấn đề liên quan