Youtube 视频未在 RecyclerView 中显示

Posted

技术标签:

【中文标题】Youtube 视频未在 RecyclerView 中显示【英文标题】:Youtube Video is not Displaying in RecyclerView 【发布时间】:2016-07-28 05:20:41 【问题描述】:

我面临的问题是 youtube 视频没有显示,只有最后一个正在播放,而且当我滚动视频时也会消失。我想要的是每个视频都应该显示,每个视频都是不同的。

public class MyRecyclerViewAdapter extends Adapter<MyRecyclerViewAdapter
.DataObjectHolder> 
private static String LOG_TAG = "MyRecyclerViewAdapter";
private ArrayList<DataObject> mDataset;
private static MyClickListener myClickListener;
private static final int RECOVERY_DIALOG_REQUEST = 10;
public  static  String key = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX";
Context ctx;
View view;

public static class DataObjectHolder extends ViewHolder
    implements View
    .OnClickListener 
    YouTubePlayerView youTubeView;
public DataObjectHolder(View itemView) 
    super(itemView);
    youTubeView = (YouTubePlayerView) itemView.findViewById(R.id.youtube_view);
    Log.i(LOG_TAG, "Adding Listener");
    itemView.setOnClickListener(this);


@Override
public void onClick(View v) 
    myClickListener.onItemClick(getAdapterPosition(), v);



public void setOnItemClickListener(MyClickListener myClickListener) 
this.myClickListener = myClickListener;


public MyRecyclerViewAdapter(Context context,ArrayList<DataObject> myDataset) 
    mDataset = myDataset;
    ctx=context;


@Override
public DataObjectHolder onCreateViewHolder(ViewGroup parent,
                                       int viewType) 
    view = LayoutInflater.from(parent.getContext())
        .inflate(R.layout.playerview_demo, parent, false);

DataObjectHolder dataObjectHolder = new DataObjectHolder(view);
return dataObjectHolder;




@Override
public void onBindViewHolder(DataObjectHolder holder, final int position) 
holder.youTubeView.initialize(key, new YouTubePlayer.OnInitializedListener() 
    @Override
    public void onInitializationSuccess(YouTubePlayer.Provider provider, YouTubePlayer player, boolean b) 
        player.cueVideo(mDataset.get(position).getmText1());
    

    @Override
    public void onInitializationFailure(YouTubePlayer.Provider provider, YouTubeInitializationResult errorReason) 
        if (errorReason.isUserRecoverableError()) 
            errorReason.getErrorDialog((Activity) ctx, RECOVERY_DIALOG_REQUEST).show();
         else 
            String errorMessage = String.format("YouTube Error (%1$s)",
                    errorReason.toString());
            Toast.makeText(ctx, errorMessage, Toast.LENGTH_LONG).show();
        
    

    protected void onActivityResult(int requestCode, int resultCode, Intent data) 
        if (requestCode == RECOVERY_DIALOG_REQUEST) 
            // Retry initialization if user performed a recovery action
            getYouTubePlayerProvider().initialize(key, this);
        
    

    protected YouTubePlayer.Provider getYouTubePlayerProvider() 
        Toast.makeText(ctx, view.toString(), Toast.LENGTH_LONG).show();
        return (YouTubePlayerView) view.findViewById(R.id.youtube_view);
    


);


public void addItem(DataObject dataObj, int index) 
mDataset.add(index, dataObj);
notifyItemInserted(index);


public void deleteItem(int index) 
mDataset.remove(index);
notifyItemRemoved(index);


@Override
public int getItemCount() 
return mDataset.size();


public interface MyClickListener 
public void onItemClick(int position, View v);


【问题讨论】:

是视频播放的期望行为,还是启动单独的播放器 (example)?请问您也可以发布您的布局文件吗? @PPartisan 我正在尝试显示 YouTube 视频列表。所以如果用户点击任何视频。它不会打开对话框或其他活动。它将在列表视图或回收器中计划它们所在的位置。 YouTubePlayerView 由于其实现方式而无法在列表/回收器视图中工作。您可以执行以下操作:创建一个 YoutubeplayerActivity 并将视频 ID 传递给此活动,然后在回收站视图中仅添加点击事件可以触发播放器活动的缩略图/图像海报。 是的,它是使用 webview 实现的。谢谢@JavaGhost 【参考方案1】:

您不能这样做,因为 YoutubePlayer 视图太大而无法添加到回收站视图中。请改用YouTubeThumbnailView 来显示缩略图。当用户点击其中一个时,您可以启动 YouTubePlayerFragment 或带有 YouTubeplayerView 视图的活动。

你的情况是这样的

public class MyRecyclerViewAdapter extends Adapter<MyRecyclerViewAdapter
.DataObjectHolder> 
private static String LOG_TAG = "MyRecyclerViewAdapter";
private ArrayList<DataObject> mDataset;
private static MyClickListener myClickListener;
private static final int RECOVERY_DIALOG_REQUEST = 10;
public  static  String key = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX";
Context ctx;
View view;

public static class DataObjectHolder extends ViewHolder
    implements View
    .OnClickListener 
    YouTubeThumbnailView youTubeThumbnailView ;
public DataObjectHolder(View itemView) 
    super(itemView);
    youTubeThumbnailView = (YouTubeThumbnailView ) itemView.findViewById(R.id.yourId);
    itemView.setOnClickListener(this);


@Override
public void onClick(View v) 
    myClickListener.onItemClick(getAdapterPosition(), v);



public void setOnItemClickListener(MyClickListener myClickListener) 
this.myClickListener = myClickListener;


public MyRecyclerViewAdapter(Context context,ArrayList<DataObject> myDataset) 
    mDataset = myDataset;
    ctx=context;


@Override
public DataObjectHolder onCreateViewHolder(ViewGroup parent,
                                       int viewType) 
    view = LayoutInflater.from(parent.getContext())
        .inflate(R.layout.playerview_demo, parent, false);

DataObjectHolder dataObjectHolder = new DataObjectHolder(view);
return dataObjectHolder;




@Override
public void onBindViewHolder(DataObjectHolder holder, final int position) 

holder.youTubeThumbnailView.initialize(key, new YouTubePlayer.OnInitializedListener() 
    @Override
    public void onInitializationSuccess(YouTubePlayer.Provider provider, YouTubePlayer player, boolean b) 
    

    @Override
    public void onInitializationFailure(YouTubePlayer.Provider provider, YouTubeInitializationResult errorReason) 
        if (errorReason.isUserRecoverableError()) 
            errorReason.getErrorDialog((Activity) ctx, RECOVERY_DIALOG_REQUEST).show();
         else 
            String errorMessage = String.format("YouTube Error (%1$s)",
                    errorReason.toString());
            Toast.makeText(ctx, errorMessage, Toast.LENGTH_LONG).show();
        
    

    protected void onActivityResult(int requestCode, int resultCode, Intent data) 
        if (requestCode == RECOVERY_DIALOG_REQUEST) 
            // Retry initialization if user performed a recovery action
            getYouTubePlayerProvider().initialize(key, this);
        
    

    protected YouTubePlayer.Provider getYouTubePlayerProvider() 
        Toast.makeText(ctx, view.toString(), Toast.LENGTH_LONG).show();
        return (YouTubePlayerView) view.findViewById(R.id.youtube_view);
    


);


public void addItem(DataObject dataObj, int index) 
mDataset.add(index, dataObj);
notifyItemInserted(index);


public void deleteItem(int index) 
mDataset.remove(index);
notifyItemRemoved(index);


@Override
public int getItemCount() 
return mDataset.size();


public interface MyClickListener 
public void onItemClick(int position, View v);


编辑 感谢 Irfan Raza 指出这一点。看this的回答,好像可以搞定

【讨论】:

可以在运行时完成。看到这个答案***.com/questions/33558818/…【参考方案2】:

如果我理解正确,您的 RecyclerView 中的项目没有正确/完全显示?一些屏幕截图和您的 xml 文件会有所帮助。

如果这确实是问题,请检查您的 playerview_demo.xml 是否将 layout_height 设置为 wrap_content

如果没有设置为wrap_content,这就是问题所在。如果没有,请告诉我们。

【讨论】:

不,xml 中没有问题。我正在分享图像的外观。 postimg.org/image/iwvkzeuab 抱歉 @user1629977 ,我没有使用此代码,而是使用 Webview 和播放 Youtube 视频。

以上是关于Youtube 视频未在 RecyclerView 中显示的主要内容,如果未能解决你的问题,请参考以下文章

YouTube 视频未在 WebView 中播放 - Android

如何使用 Youtube API 在 RecyclerView 中加载 Youtube 缩略图

Chrome 扩展程序未在 YouTube 的浏览器导航中加载

如何使用 youtube data api v3 中的 nextPageToken 在 android recycler 视图中加载更多视频

Galleria视频未在移动设备中显示视频图标

Espresso Test 6: RecyclerView