基于eclipse的android项目实战—博学谷(十七)播放记录界面

2023-11-09 02:40

本文主要是介绍基于eclipse的android项目实战—博学谷(十七)播放记录界面,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

本项目是用eclipse软件编写,经过我的亲自实践,其真实有效,希望能给您有所帮助😘😘
项目版本:android5.1.1
AVD建议:android4.4.2及以上
若有不足之处或不对的地方,欢迎大佬们指点

BoXueGu源码资源下载链接:
https://download.csdn.net/download/hyh/19477319


BoXueGu图片资源下载(免费):
https://yuyunyaohui.lanzoui.com/iWos0pyc4rc


播放记录界面主要用于显示课程详情界面播放过的视频信息

效果图:

在这里插入图片描述


1、导入界面图片

将课程详情界面所需图片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、导入 到drawable文件夹中
在这里插入图片描述


2、创建课程详情界面布局文件activity_play_history.xml

res/layout文件夹中新建activity_play_history.xml文件,代码如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical" 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>

3、播放记录界面Item

res/layout文件夹中,创建一个布局文件play_history_list_item.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="horizontal" android:background="@android:color/white"android:gravity="center_vertical"android:padding="10dp" ><RelativeLayout android: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"/><ImageView android:layout_width="30dp"android:layout_height="30dp"android:src="@android:drawable/ic_media_play" android:layout_centerInParent="true" /></RelativeLayout><LinearLayout android:layout_width="fill_parent"android:layout_height="wrap_content"android:orientation="vertical"android:layout_marginLeft="15dp"android:layout_gravity="center_vertical"><TextView android:id="@+id/tv_adapter_title"android:layout_width="wrap_content"android:layout_height="fill_parent"android:textSize="16sp"android:textColor="#333333"android:text="第1章 Android基础入门"android:gravity="center_vertical" /><TextView android: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:text="Android系统简介"android:gravity="center_vertical" /></LinearLayout>
</LinearLayout>

4、播放记录界面Adapter

由于播放记录界面的视频列表用到了ListView控件,因此需要创建一个数据适配器PlayHistoryAdapterListView进行数据适配

.adapter包中,创建一个PlayHistoryAdapter类继承BaseAdapter

package china.ynyx.heyunhui.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 china.ynyx.heyunhui.R;
import china.ynyx.heyunhui.activity.VideoPlayActivity;
import china.ynyx.heyunhui.bean.VideoBean;import java.util.List;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();}/*** 获取Item的总数*/@Overridepublic int getCount() {return vbl == null ? 0 : vbl.size();}/*** 根据position得到对应Item的对象*/@Overridepublic VideoBean getItem(int position) {return vbl == null ? null : vbl.get(position);}/*** 根据position得到对应Item的id*/@Overridepublic long getItemId(int position) {return position;}/*** 得到相应position对应的Item视图,* position是当前Item的位置,* convertView参数就是滚出屏幕的Item的View*/@Overridepublic View getView(final int position, View convertView, ViewGroup parent) {final ViewHolder vh;if (convertView == null) {vh = new ViewHolder();convertView = LayoutInflater.from(mContext).inflate(R.layout.play_history_list_item, null);vh.tv_title = (TextView) convertView.findViewById(R.id.tv_adapter_title);vh.tv_video_title=(TextView) convertView.findViewById(R.id.tv_video_title);vh.iv_icon = (ImageView) convertView.findViewById(R.id.iv_video_icon);convertView.setTag(vh);} else {vh = (ViewHolder) convertView.getTag();}final VideoBean bean = getItem(position);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;}}convertView.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {if (bean == null) return;//跳转到播放视频界面Intent intent=new Intent(mContext,VideoPlayActivity.class);intent.putExtra("videoPath", bean.videoPath);mContext.startActivity(intent);}});return convertView;}class ViewHolder {public TextView tv_title,tv_video_title;public ImageView iv_icon;}
}

5、创建从数据库获取播放记录的方法

由 于 播 放 记 录 界 面 的 数 据 是 从 数 据 库 中 获 取 的 , 同 时 操 作 数 据 库 的 方 法 都 放 在 DBUtils工具类中,因此需找到.utils包的DBUtils.java文件, 在该文件中添加一个getVideoHistory()方法来获取播放记录数据,具体代码如下:

	/*** 获取视频记录信息*/public List<VideoBean> getVideoHistory(String userName) {String sql = "SELECT * FROM " + SQLiteHelper.U_VIDEO_PLAY_LIST+" WHERE userName=?";Cursor cursor = db.rawQuery(sql, new String[]{userName});List<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;}

6、播放记录界而逻辑代码

当进入播放记录界面时需要从数据库中获取播放过的视频信息,如果没有视频信息, 则提示暂无播放记录;如果有视频信息,则把数据显示在ListView控件上。

.activity包里面新建PlayHistoryActivity.java,具体代码如下:

package china.ynyx.heyunhui.activity;import android.content.pm.ActivityInfo;
import android.support.v7.app.AppCompatActivity;
import java.util.ArrayList;
import java.util.List;
import android.graphics.Color;
import android.os.Bundle;
import android.view.View;
import android.widget.ListView;
import android.widget.RelativeLayout;
import android.widget.TextView;
import china.ynyx.heyunhui.R;
import china.ynyx.heyunhui.adapter.PlayHistoryAdapter;
import china.ynyx.heyunhui.bean.VideoBean;
import china.ynyx.heyunhui.utils.AnalysisUtils;
import china.ynyx.heyunhui.utils.DBUtils;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();}/*** 初始化UI控件*/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();}});}
}

7、修改“我”的界面

由于播放记录界面是通过“我”的界面跳转的,因此需要在.view包中找到的MylnfoView.java文件中的initView()方法,在注释“//跳转到播放记录界面” 下方添加如下代码:

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

在这里插入图片描述

11、修改AndroidManifest.xml文件

AndroidManifest.xml文件中添加如下代码:

<activity android:name="china.ynyx.heyunhui.activity.PlayHistoryActivity"></activity>

参考资料:《android项目实战——博学谷》(黑马程序员著)


基于eclipse的android项目实战—博学谷(零)创建和运行Android项目
基于eclipse的android项目实战—博学谷(一)欢迎界面
基于eclipse的android项目实战—博学谷(二)注册界面
基于eclipse的android项目实战—博学谷(三)登录界面
基于eclipse的android项目实战—博学谷(四)底部导航栏
基于eclipse的android项目实战—博学谷(五)“我”的模块
基于eclipse的android项目实战—博学谷(六)设置界面
基于eclipse的android项目实战—博学谷(七)修改密码
基于eclipse的android项目实战—博学谷(八)设置密保和找回密码
基于eclipse的android项目实战—博学谷(九)个人资料界面
基于eclipse的android项目实战—博学谷(十)个人资料修改
基于eclipse的android项目实战—博学谷(十 一)习题界面
基于eclipse的android项目实战—博学谷(十二)习题详情界面
基于eclipse的android项目实战—博学谷(十三)水平滑动广告栏界面
基于eclipse的android项目实战—博学谷(十四)课程界面
基于eclipse的android项目实战—博学谷(十五)课程详情界面
基于eclipse的android项目实战—博学谷(十六)视频播放界面
基于eclipse的android项目实战—博学谷(十七)播放记录界面
基于eclipse的android项目实战—博学谷(十八)播放不同视频(网络视频)
基于eclipse的android项目实战—博学谷(十九)播放不同视频(本地视频)

这篇关于基于eclipse的android项目实战—博学谷(十七)播放记录界面的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/373657

相关文章

MySQL 多列 IN 查询之语法、性能与实战技巧(最新整理)

《MySQL多列IN查询之语法、性能与实战技巧(最新整理)》本文详解MySQL多列IN查询,对比传统OR写法,强调其简洁高效,适合批量匹配复合键,通过联合索引、分批次优化提升性能,兼容多种数据库... 目录一、基础语法:多列 IN 的两种写法1. 直接值列表2. 子查询二、对比传统 OR 的写法三、性能分析

Python办公自动化实战之打造智能邮件发送工具

《Python办公自动化实战之打造智能邮件发送工具》在数字化办公场景中,邮件自动化是提升工作效率的关键技能,本文将演示如何使用Python的smtplib和email库构建一个支持图文混排,多附件,多... 目录前言一、基础配置:搭建邮件发送框架1.1 邮箱服务准备1.2 核心库导入1.3 基础发送函数二、

Android kotlin中 Channel 和 Flow 的区别和选择使用场景分析

《Androidkotlin中Channel和Flow的区别和选择使用场景分析》Kotlin协程中,Flow是冷数据流,按需触发,适合响应式数据处理;Channel是热数据流,持续发送,支持... 目录一、基本概念界定FlowChannel二、核心特性对比数据生产触发条件生产与消费的关系背压处理机制生命周期

Android ClassLoader加载机制详解

《AndroidClassLoader加载机制详解》Android的ClassLoader负责加载.dex文件,基于双亲委派模型,支持热修复和插件化,需注意类冲突、内存泄漏和兼容性问题,本文给大家介... 目录一、ClassLoader概述1.1 类加载的基本概念1.2 android与Java Class

PowerShell中15个提升运维效率关键命令实战指南

《PowerShell中15个提升运维效率关键命令实战指南》作为网络安全专业人员的必备技能,PowerShell在系统管理、日志分析、威胁检测和自动化响应方面展现出强大能力,下面我们就来看看15个提升... 目录一、PowerShell在网络安全中的战略价值二、网络安全关键场景命令实战1. 系统安全基线核查

从原理到实战深入理解Java 断言assert

《从原理到实战深入理解Java断言assert》本文深入解析Java断言机制,涵盖语法、工作原理、启用方式及与异常的区别,推荐用于开发阶段的条件检查与状态验证,并强调生产环境应使用参数验证工具类替代... 目录深入理解 Java 断言(assert):从原理到实战引言:为什么需要断言?一、断言基础1.1 语

深度解析Java项目中包和包之间的联系

《深度解析Java项目中包和包之间的联系》文章浏览阅读850次,点赞13次,收藏8次。本文详细介绍了Java分层架构中的几个关键包:DTO、Controller、Service和Mapper。_jav... 目录前言一、各大包1.DTO1.1、DTO的核心用途1.2. DTO与实体类(Entity)的区别1

Java MQTT实战应用

《JavaMQTT实战应用》本文详解MQTT协议,涵盖其发布/订阅机制、低功耗高效特性、三种服务质量等级(QoS0/1/2),以及客户端、代理、主题的核心概念,最后提供Linux部署教程、Sprin... 目录一、MQTT协议二、MQTT优点三、三种服务质量等级四、客户端、代理、主题1. 客户端(Clien

在Spring Boot中集成RabbitMQ的实战记录

《在SpringBoot中集成RabbitMQ的实战记录》本文介绍SpringBoot集成RabbitMQ的步骤,涵盖配置连接、消息发送与接收,并对比两种定义Exchange与队列的方式:手动声明(... 目录前言准备工作1. 安装 RabbitMQ2. 消息发送者(Producer)配置1. 创建 Spr

深度解析Spring Boot拦截器Interceptor与过滤器Filter的区别与实战指南

《深度解析SpringBoot拦截器Interceptor与过滤器Filter的区别与实战指南》本文深度解析SpringBoot中拦截器与过滤器的区别,涵盖执行顺序、依赖关系、异常处理等核心差异,并... 目录Spring Boot拦截器(Interceptor)与过滤器(Filter)深度解析:区别、实现