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 视图中加载更多视频