这一篇主要来讲视频的播放,上一篇说主页面是Indicator+ViewPager+Fragment的布局,所以,在线视频的数据是展示在OnlineFragment中,本地视频的数据是展示在LocalFragment中的。

一. 在线播放列表(OnlineFragment.java):
在OnlineFragment中,我们以GridView的形式展示网络视频数据,所以OnlineFragment中只包含一个GridView控件,看代码:

public class OnlineFragment extends Fragment {private GridView mGvOnline;private List<VideoInfo> mOnlineDatas;private OnlineGridAdapter mAdapter;@Nullable@Overridepublic View onCreateView(LayoutInflater inflater,@Nullable ViewGroup container,@Nullable Bundle savedInstanceState) {View view = inflater.inflate(R.layout.fragment_online, null);mGvOnline = (GridView) view.findViewById(R.id.online_grid);mOnlineDatas = setData(3);mAdapter = new OnlineGridAdapter(getActivity(), mOnlineDatas);mGvOnline.setAdapter(mAdapter);return view;}/*** 以下为构造的虚假数据,如果真正项目,* 需要从服务去取视频相关数据* @param size*/private List<VideoInfo> setData(int size){List<VideoInfo> list = new ArrayList<VideoInfo>();for (int i=0; i<size; i++){String title = "新白娘子传奇(恶搞)";String url = "http://wsqncdn.miaopai.com/stream/jCbI0KliCs0jehZm4EwZ~g__.mp4";VideoInfo info = new VideoInfo();info.setTitle(title);info.setUrl(url);list.add(info);}return list;}
}

可以注意到,我们mOnlineDatas的数据是通过setData()方法造的一些假数据,正式项目需要从服务器拿视频的相关数据,我这里没有服务,所以就造了一些假的,但是我们的视频还是网络上的视频,这点不影响。mOnlineDatas需要设置给mAdapter,所以来看OnlineGridAdapter。

OnlineGridAdapter.java:

    @Overridepublic View getView(final int position, View convertView, ViewGroup parent) {ViewHolder holder = null;if (convertView == null){holder = new ViewHolder();convertView = mInflater.inflate(R.layout.item_online_grid, parent, false);holder.mIv = (ImageView) convertView.findViewById(R.id.item_online_image);holder.mTvTitle = (TextView) convertView.findViewById(R.id.item_online_title);convertView.setTag(holder);}else{holder = (ViewHolder) convertView.getTag();}holder.mTvTitle.setText(mDatas.get(position).getTitle());convertView.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Intent intent = new Intent(mContext, PlayActivity.class);intent.putExtra(Contants.VIDEO_POSITION, position);intent.putExtra(Contants.VIDEO_FILES, (Serializable) mDatas);intent.putExtra(Contants.VIDEO_FROM, Contants.ONLINE);mContext.startActivity(intent);}});return convertView;}

在线视频列表中,只展示了视频缩略图和标题,当然,这两个数据是在代码中写死的,正常应该是从服务器中拿。
最后,设置convertView的点击事件,当点击某一项时,跳转至PlayActivity页面播放视频,intent携带了三个参数,当前位置position,视频集合mDatas和视频来源(本地还是在线)。
效果图:

二. 本地播放列表(LocalFragment.java):
在LocalFragment中,我们是以List的形式展示本地视频数据的,所以,LocalFragment中包含一个ListView控件,代码如下:

public class LocalFragment extends Fragment {private ListView mLocalLv;private List<VideoInfo> mLocalDatas;private LocalListAdapter mAdapter;@Nullable@Overridepublic View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {View view = inflater.inflate(R.layout.fragment_local, null);mLocalLv = (ListView) view.findViewById(R.id.local_list);mLocalDatas = Utils.getVideoFiles(getActivity());mAdapter = new LocalListAdapter(getActivity(), mLocalDatas);mLocalLv.setAdapter(mAdapter);return view;}
}

从上边可以看到,mLocalDatas的数据是调用Utils.getVideoFiles方法来获取SD上的视频文件的,而我们把每一个视频相关的信息封装为一个VideoInfo的实体类。然后把没LocalDatas设置给mAdapter,mAdapter负责展示在ListView中,下面来看LocalListAdapter。

LocalListAdapter.java:
只看最主要的getView方法:

    @Overridepublic View getView(final int position, View convertView, ViewGroup parent) {ViewHolder holder = null;if (convertView == null){holder = new ViewHolder();convertView = mInflater.inflate(R.layout.item_local_list, parent, false);holder.mIvThumb = (ImageView) convertView.findViewById(R.id.item_local_thumb);holder.mTvTitle = (TextView) convertView.findViewById(R.id.item_local_title);holder.mTvDuration = (TextView) convertView.findViewById(R.id.item_local_duration);convertView.setTag(holder);}else{holder = (ViewHolder) convertView.getTag();}Bitmap bitmap = Utils.getVideoThumbnail(mDatas.get(position).getUrl());if (bitmap != null){holder.mIvThumb.setImageBitmap(bitmap);}holder.mTvTitle.setText(mDatas.get(position).getDisplayName());holder.mTvDuration.setText(Utils.formatToString(mDatas.get(position).getDuration()));convertView.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Intent intent = new Intent(mContext, PlayActivity.class);intent.putExtra(Contants.VIDEO_POSITION, position);intent.putExtra(Contants.VIDEO_FILES, (Serializable) mDatas);intent.putExtra(Contants.VIDEO_FROM, Contants.LOCAL);mContext.startActivity(intent);}});return convertView;}

可以看到,我们展示在列表的视频信息有三个:缩略图,标题和时长。缩略图通过Utils.getVideoThumbnail()方法获取,标题和时长通过从LocalFragment传递过来的数据的集合获取。
最后,设置convertView的点击事件,当点击某一项时,跳转至PlayActivity页面播放视频,intent携带了三个参数,当前位置position,视频集合mDatas和视频来源(本地还是在线)。
效果图:

这一篇主要了解视频列表的布局和实现,下一篇最重要,开始讲如何播放视频

视频播放器(二)——播放列表相关推荐

  1. Android 视频播放器 (二):使用MediaPlayer播放视频

    在 Android 视频播放器 (一):使用VideoView播放视频 我们讲了一下如何使用VideoView播放视频,了解了基本的播放器的一些知识和内容.也知道VideoView内部封装的就是Med ...

  2. 【Android视频 之 阿里云视频播放器 二】

    说明一下:写文章时,我用的最新sdk版本是 4.7.0 哦,这里也只贴出关键代码,更多详细代码在文章末尾有地址链接的. [Android视频 之 阿里云视频播放器 一] 1 视频试看功能的实现 效果图 ...

  3. C++ Qt高仿QQ影音视频播放器 (二)

      本篇介绍QQ影音标题栏的实现.   一般在Qt客户端开发时,都会采用无边框窗口,去掉窗口边框后就没有标题栏了,此时就得自定义标题栏,自己实现窗口的移动.拉伸.缩放等功能.   我是在VS2019里 ...

  4. Android课程设计之视频播放器

    CSDN下载:https://download.csdn.net/download/eseszb/10463442 移动互联网开发   课程设计报告 学生姓名:学 号: 专业:计算机科学与技术 班级: ...

  5. Android FFmpeg视频播放器三 音频封装格式解码播放

    Android FFmpeg视频播放器一解封装 Android Android FFmpeg视频播放器二 视频封装格式解码播放 视频解封装之后就会得到音频流和视频流,解封状得到的数据是AVPackag ...

  6. 【Android视频 之 阿里云视频播放器 一】

    说到视频,现在短视频,小视频真是火的不行,抖音,快手,更是很多人手机上必会安装的一款app.那如何开发一款类似于抖音,集视频播放,直播,点播,拍摄,滤镜于一体的app呢,想想那都是相当的复杂.说到这里 ...

  7. 15个最佳HTML5视频播放器

    随着YouTube最近的一项政策变化,即要求创作者在获得广告收入之前必须达到10,000次观看,因此我们看到了YouTube黄金时代的落日. 现在,比以往任何时候都更需要推动创意者开发自己的视频平台并 ...

  8. C语言基于GTK+Libvlc实现的简易视频播放器(二)

    简易视频播放器-全屏播放 一.课程说明 上一次我们使用gtk+libvlc实现了一个最简单的视频播放器,可以实现点击按钮暂定和停止播放视频,以及同步显示视频播放进度,但即使作为一个视频播放器,只有这些 ...

  9. android 音乐视频播放器(github上十二款最著名的Android播放器开源项目)

    1.ijkplayer 项目地址: https://github.com/Bilibili/ijkplayer 介绍:Ijkplayer 是Bilibili发布的基于 FFplay 的轻量级 Andr ...

最新文章

  1. COS 访谈第 19 期:张志华教授
  2. 吴恩达机器学习笔记 —— 18 大规模机器学习
  3. Spring 在 xml配置文件 或 annotation 注解中 运用Spring EL表达式
  4. Codeforces 988F. Rain and Umbrellas
  5. 计算机专业研究生应该如何规划,【图片】2020考研,老学长教你如何规划!【计算机考研吧】_百度贴吧...
  6. 个推开发者服务进阶之路
  7. 利用HttpWebRequest实现实体对象的上传
  8. Linux 命令(67)—— time 命令
  9. Vue-购物车简单案例
  10. 《大数据之路:阿里巴巴大数据实践》-第1章 总述
  11. laravel文件命名规范
  12. web接入 微信SDK
  13. smartbi 安装教程
  14. Jmeter与搜狗输入法、百度输入法不兼容问题解决方法
  15. Windows中如何修改Intel网卡的注册表使Wireshark可以抓取802.1q tag包
  16. 3.3 费马质数测试
  17. Android Manifest内容解析
  18. 在html中怎么加边框,HTML怎么加边框
  19. 计算机输入知识竞赛简讯,计算机学院积极参与“不忘初心之感知我矿大”知识竞赛...
  20. RK3229平台Android6.0系统的一些定制性需求开发

热门文章

  1. 追MM“23式”—— GOF 23种设计模式
  2. 01 电阻的简介及常见电路分析
  3. 面向对象开发期末复习概述(二)
  4. day9-字符串和集合作业
  5. babaliuliu游戏视频--选择1号角色初体验
  6. 三星临时取消Galaxy Fold中国发布会;视觉中国网站部分恢复上线?官方回应:并未恢复;特斯拉周一发布完全自动驾驶将网络直播 | 雷锋早报...
  7. Mardown、LaTex编辑器推荐
  8. 程序员常见10大口头禅
  9. 基于移动位置服务器,基于移动位置的服务系统及方法
  10. Swift SwiftUI 必备础库之 01 Introspect