基于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

相关文章

使用Python批量将.ncm格式的音频文件转换为.mp3格式的实战详解

《使用Python批量将.ncm格式的音频文件转换为.mp3格式的实战详解》本文详细介绍了如何使用Python通过ncmdump工具批量将.ncm音频转换为.mp3的步骤,包括安装、配置ffmpeg环... 目录1. 前言2. 安装 ncmdump3. 实现 .ncm 转 .mp34. 执行过程5. 执行结

SpringBoot 多环境开发实战(从配置、管理与控制)

《SpringBoot多环境开发实战(从配置、管理与控制)》本文详解SpringBoot多环境配置,涵盖单文件YAML、多文件模式、MavenProfile分组及激活策略,通过优先级控制灵活切换环境... 目录一、多环境开发基础(单文件 YAML 版)(一)配置原理与优势(二)实操示例二、多环境开发多文件版

Three.js构建一个 3D 商品展示空间完整实战项目

《Three.js构建一个3D商品展示空间完整实战项目》Three.js是一个强大的JavaScript库,专用于在Web浏览器中创建3D图形,:本文主要介绍Three.js构建一个3D商品展... 目录引言项目核心技术1. 项目架构与资源组织2. 多模型切换、交互热点绑定3. 移动端适配与帧率优化4. 可

sky-take-out项目中Redis的使用示例详解

《sky-take-out项目中Redis的使用示例详解》SpringCache是Spring的缓存抽象层,通过注解简化缓存管理,支持Redis等提供者,适用于方法结果缓存、更新和删除操作,但无法实现... 目录Spring Cache主要特性核心注解1.@Cacheable2.@CachePut3.@Ca

从原理到实战解析Java Stream 的并行流性能优化

《从原理到实战解析JavaStream的并行流性能优化》本文给大家介绍JavaStream的并行流性能优化:从原理到实战的全攻略,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的... 目录一、并行流的核心原理与适用场景二、性能优化的核心策略1. 合理设置并行度:打破默认阈值2. 避免装箱

Maven中生命周期深度解析与实战指南

《Maven中生命周期深度解析与实战指南》这篇文章主要为大家详细介绍了Maven生命周期实战指南,包含核心概念、阶段详解、SpringBoot特化场景及企业级实践建议,希望对大家有一定的帮助... 目录一、Maven 生命周期哲学二、default生命周期核心阶段详解(高频使用)三、clean生命周期核心阶

Android协程高级用法大全

《Android协程高级用法大全》这篇文章给大家介绍Android协程高级用法大全,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友跟随小编一起学习吧... 目录1️⃣ 协程作用域(CoroutineScope)与生命周期绑定Activity/Fragment 中手

Python实战之SEO优化自动化工具开发指南

《Python实战之SEO优化自动化工具开发指南》在数字化营销时代,搜索引擎优化(SEO)已成为网站获取流量的重要手段,本文将带您使用Python开发一套完整的SEO自动化工具,需要的可以了解下... 目录前言项目概述技术栈选择核心模块实现1. 关键词研究模块2. 网站技术seo检测模块3. 内容优化分析模

Java 正则表达式的使用实战案例

《Java正则表达式的使用实战案例》本文详细介绍了Java正则表达式的使用方法,涵盖语法细节、核心类方法、高级特性及实战案例,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要... 目录一、正则表达式语法详解1. 基础字符匹配2. 字符类([]定义)3. 量词(控制匹配次数)4. 边

Java Scanner类解析与实战教程

《JavaScanner类解析与实战教程》JavaScanner类(java.util包)是文本输入解析工具,支持基本类型和字符串读取,基于Readable接口与正则分隔符实现,适用于控制台、文件输... 目录一、核心设计与工作原理1.底层依赖2.解析机制A.核心逻辑基于分隔符(delimiter)和模式匹