由于这个模块内容较多,分为上、中、下 三篇博客分别来讲述,请耐心阅读。


课程模块分为四个部分

  • 课程列表
  • 课程详情
  • 视频播放
  • 播放记录

课程模块(下)主要讲述视频播放和播放记录两个部分

一、视频播放

1、视频播放界面

(1)、创建视频播放界面

com.boxuegu.activity包中创建一个Java类,命名为VideoPlayActivity。在res/layout文件夹下创建布局文件,命名为activity_video_play

(2)、界面代码——activity_video_play.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"><VideoViewandroid:id="@+id/videoView"android:layout_width="fill_parent"android:layout_height="fill_parent" /></RelativeLayout>

2、视频播放界面逻辑代码

(1)、在res文件夹下创建raw文件夹。用来存放视频。放入测试视频video11.mp4

(2)。逻辑代码——VideoPlayActivity.java

package com.boxuegu.activity;import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.text.TextUtils;
import android.view.KeyEvent;
import android.view.WindowManager;
import android.widget.MediaController;
import android.widget.Toast;
import android.widget.VideoView;
import com.boxuegu.R;public class VideoPlayActivity extends AppCompatActivity {private MediaController controller;private VideoView videoView;private String videoPath;private int position;private String url;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_video_play);getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);videoPath = getIntent().getStringExtra("videoPath");position = getIntent().getIntExtra("position",0);init();}private void init(){videoView = (VideoView)findViewById(R.id.videoView);controller = new MediaController(this);videoView.setMediaController(controller);play();}private void play(){if (TextUtils.isEmpty(videoPath)){Toast.makeText(this,"本地没有视频,暂时无法播放",Toast.LENGTH_SHORT).show();return;}String uri = "android.resource://" + getPackageName() + "/" + R.raw.video11;videoView.setVideoPath(uri);videoView.start();}@Overridepublic boolean onKeyDown(int keyCode, KeyEvent event){//把视频详情界面传过来的被点击视频的位置传递回去Intent data = new Intent();data.putExtra("position",position);setResult(RESULT_OK,data);return  super.onKeyDown(keyCode,event);}
}

3、修改界面代码

(1)、找到VideoListActivity.java文件,在注释//跳转到视频播放界面下方添加如下代码:

Intent intent=new Intent(VideoListActivity.this,VideoPlayActivity.class);
intent.putExtra("videoPath",videoPath);
intent.putExtra("position",position);
startActivityForResult(intent,1);

(1)、找到VideoListActivity.java文件,添加以下方法:

 @Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {super.onActivityResult(requestCode, resultCode, data);if (data!=null){//int position = data.getIntExtra("position",0);adapter.setSelectedPosition(position);//lv_video_list.setVisibility(View.VISIBLE);sv_chapter_intro.setVisibility(View.GONE);tv_intro.setBackgroundColor(Color.parseColor("#FFFFFF"));tv_video.setBackgroundColor(Color.parseColor("#30B4FF"));tv_intro.setTextColor(Color.parseColor("#000000"));tv_video.setTextColor(Color.parseColor("#FFFFFF"));}}

二、播放记录

1、播放记录界面

(1)、创建播放记录界面

com.boxuegu.activity包中创建一个Java类,命名为PlayHistoryActivity,创建布局文件activity_play_history。导入所需界面图片 video_play_icon1.pngvideo_play_icon2.pngvideo_play_icon3.pngvideo_play_icon4.pngvideo_play_icon5.pngvideo_play_icon6.pngvideo_play_icon7.pngvideo_play_icon8.pngvideo_play_icon9.pngvideo_play_icon10.png

(2)界面代码——activity_play_history.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical"android:layout_width="match_parent"android:layout_height="match_parent"android:background="@android:color/white"><include layout="@layout/main_title_bar"/><RelativeLayoutandroid:layout_width="fill_parent"android:layout_height="fill_parent"><ListViewandroid:id="@+id/lv_list"android:layout_width="fill_parent"android:layout_height="fill_parent"android:divider="#E4E4E4"android:dividerHeight="1dp"android:scrollbars="none"/><TextViewandroid:id="@+id/tv_none"android:layout_width="fill_parent"android:layout_height="fill_parent"android:gravity="center"android:text="暂无播放记录"android:textColor="@android:color/darker_gray"android:textSize="16sp"android:visibility="gone"/></RelativeLayout>
</LinearLayout>

2、播放记录界面Item

(1)、创建播放记录界面Item,在res/layout文件夹下创建一个布局文件,命名为play_history_list_item

(2)、界面代码play_history_list_item.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="horizontal"android:layout_width="match_parent"android:layout_height="wrap_content"android:background="@android:color/white"android:gravity="center_vertical"android:padding="10dp"><RelativeLayoutandroid:layout_width="wrap_content"android:layout_height="wrap_content"><ImageViewandroid:id="@+id/iv_video_icon"android:layout_width="100dp"android:layout_height="75dp"android:src="@drawable/video_play_icon2"/><ImageViewandroid:src="@android:drawable/ic_media_play"android:layout_width="30dp"android:layout_height="30dp"android:layout_centerInParent="true"/></RelativeLayout><LinearLayoutandroid:layout_width="fill_parent"android:layout_height="wrap_content"android:orientation="vertical"android:layout_marginLeft="15dp"android:layout_gravity="center_vertical"><TextViewandroid:id="@+id/tv_adapter_title"android:layout_width="wrap_content"android:layout_height="fill_parent"android:textSize="16sp"android:textColor="#333333"android:gravity="center_vertical"/><TextViewandroid:layout_marginTop="4dp"android:id="@+id/tv_video_title"android:layout_width="wrap_content"android:layout_height="fill_parent"android:textSize="12sp"android:textColor="#a3a3a3"android:gravity="center_vertical"/></LinearLayout>
</LinearLayout>

3、播放记录界面Adapter

com.boxuegu.adapter包下创建一个Java类,命名为PlayHistoryAdapter。代码如下:

package com.boxuegu.adapter;import android.content.Context;
import android.content.Intent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;
import java.util.List;
import com.boxuegu.R;
import com.boxuegu.activity.VideoPlayActivity;
import com.boxuegu.bean.VideoBean;//播放历史
public class PlayHistoryAdapter extends BaseAdapter {private Context mContext;private List<VideoBean> vbl;public PlayHistoryAdapter(Context context){this.mContext = context;}public void setData(List<VideoBean> vbl){this.vbl = vbl;notifyDataSetChanged();}@Overridepublic int getCount() {return vbl == null ? 0 : vbl.size();}@Overridepublic VideoBean getItem(int i) {return vbl == null ? null : vbl.get(i);}@Overridepublic long getItemId(int i) {return i;}@Overridepublic View getView(final int i, View view, ViewGroup viewGroup) {final ViewHolder vh;if (view == null){vh = new ViewHolder();view = LayoutInflater.from(mContext).inflate(R.layout.play_history_list_item,null);vh.tv_title = (TextView) view.findViewById(R.id.tv_adapter_title);vh.tv_video_title = (TextView) view.findViewById(R.id.tv_video_title);vh.iv_icon = (ImageView) view.findViewById(R.id.iv_video_icon);view.setTag(vh);}else{vh = (ViewHolder) view.getTag();}final VideoBean bean = getItem(i);if (bean!=null){vh.tv_title.setText(bean.title);vh.tv_video_title.setText(bean.secondTitle);switch (bean.chapterId){case 1:vh.iv_icon.setImageResource(R.drawable.video_play_icon1);break;case 2:vh.iv_icon.setImageResource(R.drawable.video_play_icon2);break;case 3:vh.iv_icon.setImageResource(R.drawable.video_play_icon3);break;case 4:vh.iv_icon.setImageResource(R.drawable.video_play_icon4);break;case 5:vh.iv_icon.setImageResource(R.drawable.video_play_icon5);break;case 6:vh.iv_icon.setImageResource(R.drawable.video_play_icon6);break;case 7:vh.iv_icon.setImageResource(R.drawable.video_play_icon7);break;case 8:vh.iv_icon.setImageResource(R.drawable.video_play_icon8);break;case 9:vh.iv_icon.setImageResource(R.drawable.video_play_icon9);break;case 10:vh.iv_icon.setImageResource(R.drawable.video_play_icon10);break;default:vh.iv_icon.setImageResource(R.drawable.video_play_icon1);break;}}view.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {if (bean==null) return;Intent intent = new Intent(mContext, VideoPlayActivity.class);intent.putExtra("videoPath",bean.videoPath);mContext.startActivity(intent);}});return view;}class ViewHolder{public TextView tv_title,tv_video_title;public ImageView iv_icon;}
}

4、播放记录界面逻辑代码——PlayHistoryActivity.java

package com.boxuegu.activity;import android.content.pm.ActivityInfo;
import com.boxuegu.R;
import com.boxuegu.adapter.PlayHistoryAdapter;
import com.boxuegu.bean.VideoBean;
import com.boxuegu.utils.AnalysisUtils;
import com.boxuegu.utils.DBUtils;
import android.graphics.Color;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.ListView;
import android.widget.RelativeLayout;
import android.widget.TextView;import java.util.ArrayList;
import java.util.List;public class PlayHistoryActivity extends AppCompatActivity {private TextView tv_main_title, tv_back, tv_none;private RelativeLayout rl_title_bar;private ListView lv_list;private PlayHistoryAdapter adapter;private List<VideoBean> vbl;private DBUtils db;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_play_history);setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);db=DBUtils.getInstance(this);vbl=new ArrayList<VideoBean>();vbl=db.getVideoHistory(AnalysisUtils.readLoginUserName(this));init();}private void init(){tv_main_title = (TextView) findViewById(R.id.tv_main_title);tv_main_title.setText("播放记录");rl_title_bar = (RelativeLayout) findViewById(R.id.title_bar);rl_title_bar.setBackgroundColor(Color.parseColor("#30B4ff"));tv_back = (TextView) findViewById(R.id.tv_back);lv_list = (ListView) findViewById(R.id.lv_list);tv_none = (TextView) findViewById(R.id.tv_none);if (vbl.size()==0){tv_none.setVisibility(View.VISIBLE);}adapter=new PlayHistoryAdapter(this);adapter.setData(vbl);lv_list.setAdapter(adapter);tv_back.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {PlayHistoryActivity.this.finish();PlayHistoryActivity.this.finish();}});}
}

5、修改界面代码

(1)、找到DBUtils.java,添加如下代码:

public ArrayList<VideoBean> getVideoHistory(String userName){String sql="SELECT * FROM " + SQLiteHelper.U_VIDEO_PLAY_LIST + " WHERE userName = ?";Cursor cursor = db.rawQuery(sql,new String[]{userName});ArrayList<VideoBean> vbl = new ArrayList<VideoBean  >();VideoBean bean = null;while (cursor.moveToNext()){bean = new VideoBean();bean.chapterId = cursor.getInt(cursor.getColumnIndex("chapterId"));bean.videoId = cursor.getInt(cursor.getColumnIndex("videoId"));bean.videoPath = cursor.getString(cursor.getColumnIndex("videoPath"));bean.title = cursor.getString(cursor.getColumnIndex("title"));bean.secondTitle = cursor.getString(cursor.getColumnIndex("secondTitle"));vbl.add(bean);bean = null;}cursor.close();return vbl;}

(2)、找到MyInfoView.java文件,在注释//跳转到播放记录界面下方添加如下代码:

Intent intent = new Intent(mContext, PlayHistoryActivity.class);
mContext.startActivity(intent);

现在这个项目的基本功能都已经完成。看着自己有道云笔记里面的文章,满满的成就感。按照项目综述,后面还会有创新点打包上线的模块。由于这个项目也是移动高级开发的期末项目。所以创新点暂时不更新。期末作品上交以后会公开创新模块(7月中旬才会更新)。敬请期待!

Android项目实战系列—基于博学谷 开源地址

               

Android项目实战系列—基于博学谷(七)课程模块(下)相关推荐

  1. Android项目实战系列—基于博学谷(七)课程模块(上)

    由于这个模块内容较多,分为上.中.下 三篇博客分别来讲述,请耐心阅读. 课程模块分为四个部分 课程列表 课程详情 视频播放 播放记录 课程模块(上)主要讲述课程列表部分 一.水平滑动广告栏界面 1.创 ...

  2. android项目实战博学谷百度云,Android项目实战系列—基于博学谷(七)课程模块(下)...

    由于这个模块内容较多,分为上.中.下 三篇博客分别来讲述,请耐心阅读. 课程模块分为四个部分 [ ] [课程列表]() [ ] [课程详情]() [x] [视频播放]() [x] [播放记录]() 课 ...

  3. android中私有方法 继承,Android项目实战系列—基于博学谷(五)个人资料

    由于这个模块内容较多,篇幅较长,请耐心阅读. 个人资料模块分为两个部分 [x] [个人资料]() [x] [资料修改]() 一.个人资料 1.个人资料界面 (1).创建个人资料界面 在com.buxu ...

  4. android注册文件打开,Android项目实战系列—基于博学谷(三)注册与登录模块

    由于这个模块内容较多,篇幅较长,请耐心阅读. 注册与登录模块分为三个部分 [x] [欢迎界面]() [x] [注册界面]() [x] [登录界面]() 一.欢迎界面 1.创建工程,命名为BoXueGu ...

  5. Android项目实战系列—基于博学谷(四)我的模块(上)

    由于这个模块内容较多,篇幅较长,请耐心阅读. "我"的模块分为四个部分 我的界面 设置界面 修改密码界面 设置密保和找回密码 一."我"的界面 1.底部导航栏 ...

  6. android博学谷布局,Android项目实战系列—基于博学谷(四)我的模块(下)

    image 由于这个模块内容较多,篇幅较长,请耐心阅读. "我"的模块分为四个部分 一.修改密码 1.创建修改密码界面 在com.boxuegu.activity包中,创建一个ja ...

  7. android博学谷实验报告,Android项目实战系列—基于博学谷(四)我的模块(上)...

    image 由于这个模块内容较多,篇幅较长,请耐心阅读. "我"的模块分为四个部分 一."我"的界面 1.底部导航栏 (1).导入界面图片 将底部导航栏所需图片 ...

  8. android博学谷我的代码,Android项目实战系列—基于博学谷(四)我的模块(下)...

    由于这个模块内容较多,篇幅较长,请耐心阅读. "我"的模块分为四个部分 [ ] [我的界面]() [ ] [设置界面]() [x] [修改密码界面]() [x] [设置密保和找回密 ...

  9. Android项目实战系列—基于博学谷(六)习题模块

    由于这个模块内容较多,篇幅较长,请耐心阅读. 习题模块分为两个部分 习题列表界面 习题详情界面 一.习题列表界面 1.习题界面 (1).创建习题界面 在res/layout文件夹中,新建一个布局文件, ...

最新文章

  1. 深度学习的分布式训练--数据并行和模型并行
  2. 计算机二级vf知识点总结,2015年计算机二级考试《VFP》复习重点:第四章
  3. “黄背心”运动持续进行 马克龙发长信呼吁沟通
  4. ACM PKU 2559 Largest Rectangle in a Histogram http://acm.pku.edu.cn/JudgeOnline/problem?id=2559
  5. MySQL基本操作指令
  6. Java中super与this
  7. 西门子uss通讯实例_西门子plc1200系列的功能特点有哪些?
  8. 激活层是每一层都有吗_每一个日出日落,都是岁月痕迹。这些在东软的第一次,你还记得吗...
  9. 一个html页面最多写多少代码,在多个页面使用同一个HTML片段的代码
  10. c++11中using的使用
  11. spring3 运行起来(即做个demo)所需要的jar包
  12. skywalking学习
  13. 服务器主板支持什么cpu,怎么看主板支持什么CPU(主板和cpu兼容搭配知识)
  14. 【Python入门练手小项目】画一个蓝胖子❤️
  15. Android 多渠道包
  16. Unbuntu下U盘突然权限只读,无法重命名和复制粘贴文件的问题修复
  17. 国内TCP单边 加速 的 正确 做法
  18. app应用程序的好处
  19. MySQL数据库中视图的作用
  20. shell在xcode中涉及到的关键字

热门文章

  1. 从睡姿判断情侣间的情感关系
  2. 【blender动作练习生】从零开始的骨骼绑定学习vol.2
  3. 京东云被Forrester评为「卓越表现者」,挺近中国云计算一流行业
  4. longblob存入html文件
  5. linux主机宕机排查问题方法
  6. 【基于obs插件-9】-场景转场特效 motion-transition
  7. 美国住宅太阳能:买家的市场
  8. 硬件设计——Mark点
  9. RMAN 命令拼凑版
  10. 数值计算·第二集:矩阵的条件数(Matlab版)