Android项目实战系列—基于博学谷(七)课程模块(上)
由于这个模块内容较多,分为上、中、下 三篇博客分别来讲述,请耐心阅读。
课程模块分为四个部分
- 课程列表
- 课程详情
- 视频播放
- 播放记录
课程模块(上)主要讲述课程列表部分
一、水平滑动广告栏界面
1、创建水平滑动广告栏界面
在res/layout
文件夹下,创建一个布局文件,命名为main_adbanner
。
2、导入界面图片
将广告栏界面所需图片default_img、banner_1.png
、banner_2.png、banner_3.png
导入到drawable
文件夹。
3、界面代码——main_adbanner.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical"android:layout_width="match_parent"android:layout_height="160dp"android:id="@+id/rl_adBanner"android:background="#eeeeee"><!-- 如果没有android.support.v4包可以手动导入 --><android.support.v4.view.ViewPagerandroid:id="@+id/vp_advertBanner"android:layout_width="fill_parent"android:layout_height="fill_parent"android:layout_alignParentLeft="true"android:layout_alignParentTop="true"android:layout_marginBottom="1dp"android:background="@drawable/default_img"android:gravity="center"/><LinearLayoutandroid:layout_width="fill_parent"android:layout_height="wrap_content"android:layout_alignParentBottom="true"android:background="@android:color/transparent"><com.boxuegu.view.ViewPagerIndicatorandroid:id="@+id/vpi_advert_indicator"android:layout_width="0dp"android:layout_height="fill_parent"android:layout_weight="1"android:gravity="center"android:padding="4dp"/></LinearLayout>
</RelativeLayout>
4、自定义控件
广告栏底部小圆点需要用自定义控件来实现。在com.boxuegu.view
包中创建一个ViewPageIndicator
类并继承LinearLayout
类。代码如下:
package com.boxuegu.view;import android.content.Context;
import android.util.AttributeSet;
import android.view.Gravity;
import android.widget.ImageView;
import android.widget.LinearLayout;
import com.boxuegu.R;public class ViewPagerIndicator extends LinearLayout {private int mCount; //小圆点的个数private int mIndex; //当前小圆点的位置private Context context;public ViewPagerIndicator(Context context) {this(context,null);}public ViewPagerIndicator(Context context,AttributeSet attrs) {super(context, attrs);this.context = context;setGravity(Gravity.CENTER); //设置小圆点布局居中}//设置滑动到当前小圆点时其他小圆点的位置public void setCurrentPosition(int currentIndex){mIndex = currentIndex; //当前小圆点removeAllViews(); //移除界面上存在的viewint pex = 5;for (int i=0;i<mCount;i++){ImageView imageView = new ImageView(context);if (mIndex == i){ //滑到当前界面//蓝色小圆点imageView.setImageResource(R.drawable.indicator_on);}else{//灰色小圆点imageView.setImageResource(R.drawable.indicator_off);}imageView.setPadding(pex,0,pex,0);addView(imageView);}}//设置小圆点的数目public void setCount(int count){this.mCount = count;}
}
5、indicator_on.xml和indicator_off.xml的创建
这两个文件分别对应蓝色
和灰色
的小圆点,在drawable
文件夹下创建。
indicator_on.xml代码
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"android:shape="oval"><sizeandroid:width="6dp"android:height="6dp" /><solid android:color="#00ABF8" />
</shape>
indicator_off.xml代码
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"android:shape="oval"><sizeandroid:width="6dp"android:height="6dp" /><solid android:color="#737373" />
</shape>
二、课程界面
1、创建课程界面
在res/layout
文件夹下创建一个布局文件命名为main_view_course
。
2、导入界面图片
将所需图片 course_intro_icon.png
、chapter_1_icon.png
、chapter_2_icon.png
、chapter_3_icon.png
、chapter_4_icon.png
、chapter_5_icon.png
、chapter_6_icon.png
、chapter_7_icon.png
、chapter_8_icon.png
、chapter_9_icon.png
、chapter_10_icon.png
、导入到drawable
文件夹
3、界面代码——main_view_course.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_adbanner"/><LinearLayoutandroid:layout_width="fill_parent"android:layout_height="45dp"><ImageViewandroid:layout_width="25dp"android:layout_height="25dp"android:layout_gravity="center_vertical"android:layout_marginLeft="8dp"android:src="@drawable/course_intro_icon"/><TextViewandroid:layout_width="wrap_content"android:layout_height="fill_parent"android:layout_marginLeft="5dp"android:gravity="center_vertical"android:text="WordPress 基础教程1-10章视频"android:textColor="@android:color/black"android:textSize="16sp"android:textStyle="bold"/></LinearLayout><Viewandroid:layout_width="fill_parent"android:layout_height="1dp"android:layout_marginLeft="8dp"android:layout_marginRight="8dp"android:background="#E4E4E4"/><ListViewandroid:id="@+id/lv_list"android:layout_width="fill_parent"android:layout_height="fill_parent"android:layout_marginBottom="55dp"android:divider="@null"android:dividerHeight="0dp"android:scrollbars="none"/>
</LinearLayout>
三、课程界面Item
创建课程界面Item,在res/layout文件夹中创建一个布局文件,命名为course_list_item。代码如下:
<?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="match_parent"android:background="@android:color/white"><LinearLayoutandroid:layout_width="0dp"android:layout_height="140dp"android:layout_weight="1"android:orientation="vertical"><RelativeLayoutandroid:layout_width="fill_parent"android:layout_height="115dp"><ImageViewandroid:id="@+id/iv_left_img"android:layout_width="fill_parent"android:layout_height="fill_parent"android:paddingBottom="4dp"android:paddingLeft="8dp"android:paddingRight="4dp"android:paddingTop="8dp"android:src="@drawable/chapter_1_icon"/><TextViewandroid:id="@+id/tv_left_img_title"android:layout_width="fill_parent"android:layout_height="wrap_content"android:layout_alignParentBottom="true"android:layout_marginBottom="4dp"android:layout_marginLeft="10dp"android:layout_marginRight="6dp"android:background="#30000000"android:paddingBottom="2dp"android:paddingLeft="5dp"android:paddingRight="5dp"android:paddingTop="2dp"android:textColor="@android:color/white"android:textSize="12sp"/></RelativeLayout><TextViewandroid:id="@+id/tv_left_title"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center_horizontal"android:singleLine="true"android:textColor="@android:color/black"android:textSize="14sp"/></LinearLayout><LinearLayoutandroid:layout_width="0dp"android:layout_height="140dp"android:layout_weight="1"android:orientation="vertical"><RelativeLayoutandroid:layout_width="fill_parent"android:layout_height="115dp"><ImageViewandroid:id="@+id/iv_right_img"android:layout_width="fill_parent"android:layout_height="115dp"android:paddingBottom="4dp"android:paddingLeft="4dp"android:paddingRight="8dp"android:paddingTop="8dp"android:src="@drawable/chapter_1_icon"/><TextViewandroid:id="@+id/tv_right_img_title"android:layout_width="fill_parent"android:layout_height="wrap_content"android:layout_alignParentBottom="true"android:layout_marginBottom="4dp"android:layout_marginLeft="6dp"android:layout_marginRight="10dp"android:background="#30000000"android:paddingBottom="2dp"android:paddingLeft="5dp"android:paddingRight="5dp"android:paddingTop="2dp"android:textColor="@android:color/white"android:textSize="12sp"/></RelativeLayout><TextViewandroid:id="@+id/tv_right_title"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center_horizontal"android:singleLine="true"android:textColor="@android:color/black"android:textSize="14sp"/></LinearLayout>
</LinearLayout>
四、创建CourseBean
在com.boxuegu.bean
包中创建一个CourseBean
类,用来创建课程所有属性。
package com.boxuegu.bean;public class CourseBean {public int id; //每章IDpublic String imgTitle; //图片上的标题public String title; //章标题public String intro; //章视频简介public String icon; //广告栏上的图片
}
五、创建AdBannerFragment
在com.boxuegu
包中创建一个fragment
包,在fragment包中创建一个AdBannerFragment
类并继承Fragment类。代码如下:
package com.boxuegu.fragment;import com.boxuegu.R;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;public class AdBeannerFragment extends Fragment {private String ab; //广告private ImageView iv; //图片public static AdBeannerFragment newInstance(Bundle args){AdBeannerFragment af = new AdBeannerFragment();af.setArguments(args);return af;}@Overridepublic void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);Bundle arg = getArguments();//获取广告图片名称ab = arg.getString("ad");}@Overridepublic void onActivityCreated(Bundle savedInstanceState){super.onActivityCreated(savedInstanceState);}@Overridepublic void onResume(){super.onResume();if (ab != null){if ("banner_1".equals(ab)){iv.setImageResource(R.drawable.banner_1);}else if ("banner_2".equals(ab)){iv.setImageResource(R.drawable.banner_2);}else if ("banner_3".equals(ab)){iv.setImageResource(R.drawable.banner_3);}}}@Overridepublic void onDestroy(){super.onDestroy();if (iv != null){iv.setImageDrawable(null);}}@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState){//创建广告图片控件iv = new ImageView(getActivity());ViewGroup.LayoutParams lp = new ViewGroup.MarginLayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,ViewGroup.LayoutParams.MATCH_PARENT);iv.setLayoutParams(lp);iv.setScaleType(ImageView.ScaleType.FIT_XY);return iv;}}
六、创建AdBannerAdapter
在com.boxuegu.adapter
包中创建一个AdBannerAdapter
类并继承FragmentStatePageAdapter类,并且实现OnTouchListener
接口。
package com.boxuegu.adapter;import com.boxuegu.bean.CourseBean;
import com.boxuegu.fragment.AdBeannerFragment;
import com.boxuegu.view.CourseView;
import android.os.Bundle;
import android.os.Handler;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentStatePagerAdapter;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import java.util.ArrayList;
import java.util.List;public class AdBannerAdapter extends FragmentStatePagerAdapter implements OnTouchListener {private Handler mHandler;private List<CourseBean> cabl;public AdBannerAdapter(FragmentManager fm){super(fm);cabl = new ArrayList<CourseBean>();}public AdBannerAdapter(FragmentManager fm,Handler handler){super(fm);mHandler = handler;cabl = new ArrayList<CourseBean>();}//设置数据更新界面public void setDatas(List<CourseBean> cabl){this.cabl = cabl;notifyDataSetChanged();}@Overridepublic Fragment getItem(int index) {Bundle args = new Bundle();if (cabl.size()>0)args.putString("ad",cabl.get(index%cabl.size()).icon);return AdBeannerFragment.newInstance(args);}@Overridepublic int getCount() {return Integer.MAX_VALUE;}//返回数据集的真实容量大小public int getSize(){return cabl == null?0:cabl.size();}@Overridepublic int getItemPosition(Object object){//防止刷新结果显示列表时出现缓存数据,重载这个函数,默认返回POSITION_NONEreturn POSITION_NONE;}@Overridepublic boolean onTouch(View v, MotionEvent event) {mHandler.removeMessages(CourseView.MSG_AD_SLID);return false;}
}
七、课程界面Adapter
在com.boxuegu.adapter
包中创建一个CourseAdapter
类,继承自BaseAdapter类。代码如下:
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.VideoListActivity;
import com.boxuegu.bean.CourseBean;public class CourseAdapter extends BaseAdapter {private Context mContext;private List<List<CourseBean>> cbl;public CourseAdapter(Context context){this.mContext = context;}//设置数据更新界面public void setData(List<List<CourseBean>>cbl){this.cbl = cbl;notifyDataSetChanged();}//获取item的总数@Overridepublic int getCount() {return cbl == null?0:cbl.size();}//根据position得到对应的item的对象@Overridepublic List<CourseBean> getItem(int position) {return cbl == null ? null : cbl.get(position);}//根据position得到对应的item的ID@Overridepublic long getItemId(int position) {return position;}//得到对应position的视图@Overridepublic View getView(int position, View convertView, ViewGroup parent) {final ViewHolder vh;if (convertView == null){vh = new ViewHolder();convertView = LayoutInflater.from(mContext).inflate(R.layout.course_list_item,null);vh.iv_left_img = (ImageView) convertView.findViewById(R.id.iv_left_img);vh.iv_right_img = (ImageView) convertView.findViewById(R.id.iv_right_img);vh.tv_left_img_title = (TextView) convertView.findViewById(R.id.tv_left_img_title);vh.tv_left_title = (TextView) convertView.findViewById(R.id.tv_left_title);vh.tv_right_img_title = (TextView) convertView.findViewById(R.id.tv_right_img_title);vh.tv_right_title = (TextView) convertView.findViewById(R.id.tv_right_title);convertView.setTag(vh);}else {//复用convertViewvh = (ViewHolder) convertView.getTag();}final List<CourseBean> list = getItem(position);if (list != null){for (int i=0;i<list.size();i++){final CourseBean bean = list.get(i);switch (i){case 0: //设置左边图片与标题的信息vh.tv_left_img_title.setText(bean.imgTitle);vh.tv_left_title.setText(bean.title);setLeftImg(bean.id,vh.iv_left_img);vh.iv_left_img.setOnClickListener(new View.OnClickListener(){@Overridepublic void onClick(View v){//跳转到课程详情界面}});break;case 1: //设置右边图片与标题的信息vh.tv_right_img_title.setText(bean.imgTitle);vh.tv_right_title.setText(bean.title);setRightImg(bean.id,vh.iv_right_img);vh.iv_right_img.setOnClickListener(new View.OnClickListener(){@Overridepublic void onClick(View v){//跳转到课程详情界面}});break;default:break;}}}return convertView;}//设置左边图片private void setLeftImg(int id,ImageView iv_left_img){switch (id){case 1:iv_left_img.setImageResource(R.drawable.chapter_1_icon);break;case 3:iv_left_img.setImageResource(R.drawable.chapter_3_icon);break;case 5:iv_left_img.setImageResource(R.drawable.chapter_5_icon);break;case 7:iv_left_img.setImageResource(R.drawable.chapter_7_icon);break;case 9:iv_left_img.setImageResource(R.drawable.chapter_9_icon);break;}}//设置右边图片private void setRightImg(int id,ImageView iv_right_img){switch (id){case 2:iv_right_img.setImageResource(R.drawable.chapter_2_icon);break;case 4:iv_right_img.setImageResource(R.drawable.chapter_4_icon);break;case 6:iv_right_img.setImageResource(R.drawable.chapter_6_icon);break;case 8:iv_right_img.setImageResource(R.drawable.chapter_8_icon);break;case 10:iv_right_img.setImageResource(R.drawable.chapter_10_icon);break;}}class ViewHolder{public TextView tv_left_img_title,tv_left_title,tv_right_img_title,tv_right_title;public ImageView iv_left_img,iv_right_img;}
}
八、课程界面数据的存放
在assets
文件夹下创建一个XML文件,命名为chaptertitle.xml
,代码如下:
<?xml version="1.0" encoding="UTF-8"?><infos><course id="1"><imgtitle>博客(网站)简介</imgtitle><title>第1章 认识博客(网站)</title><intro> 博客,仅音译,英文名为Blogger,为Web Log的混成词。它的正式名称为网络日记;又音译为部落格或部落阁等,是使用特定的软件,在网络上出版、发表和张贴个人文章的人,或者是一种通常由个人管理、不定期张贴新的文章的网站。</intro></course> <course id="2"><imgtitle>Linux系统简介</imgtitle><title>第2章 Linux系统简介</title><intro> Linux,全称GNU/Linux,是一套免费使用和自由传播的类UNIX操作系统,其内核由林纳斯·本纳第克特·托瓦兹于1991年第一次释出,它主要受到Minix和Unix思想的启发,是一个基于POSIX和Unix的多用户、多任务、支持多线程和多CPU的操作系统。</intro></course> <course id="3"><imgtitle>初识WordPress</imgtitle><title>第3章 WordPress简介</title><intro> WordPress是一款个人博客系统,并逐步演化成一款内容管理系统软件,它是使用PHP语言和MySQL数据库开发的,用户可以在支持 PHP 和 MySQL数据库的服务器上使用自己的博客。</intro></course> <course id="4"><imgtitle> 安装MySQL数据库</imgtitle><title>第4章 安装MySQL数据库</title><intro> MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS (Relational Database Management System,关系数据库管理系统) 应用软件之一。</intro></course> <course id="5"><imgtitle>安装Nginx</imgtitle><title>第5章 数据存储服务器</title><intro> Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。Nginx是由伊戈尔·赛索耶夫为俄罗斯访问量第二的Rambler.ru站点(俄文:Рамблер)开发的,第一个公开版本0.1.0发布于2004年10月4日。</intro></course> <course id="6"><imgtitle>PHP的搭建</imgtitle><title>第6章 安装PHP环境</title><intro> PHP即“超文本预处理器”,是一种通用开源脚本语言。PHP是在服务器端执行的脚本语言,与C语言类似,是常用的网站编程语言。PHP独特的语法混合了C、Java、Perl以及 PHP 自创的语法。利于学习,使用广泛,主要适用于Web开发领域。</intro></course> <course id="7"><imgtitle>云服务器的购买</imgtitle><title>第7章 云服务器的购买</title><intro> 云服务器(Elastic Compute Service, ECS)是一种简单高效、安全可靠、处理能力可弹性伸缩的计算服务。其管理方式比物理服务器更简单高效。用户无需提前购买硬件,即可迅速创建或释放任意多台云服务器。</intro></course> <course id="8"><imgtitle>域名购买及备案</imgtitle><title>第8章 域名购买及备案</title><intro> 域名(英语:Domain Name),又称网域,是由一串用点分隔的名字组成的Internet上某一台计算机或计算机组的名称,用于在数据传输时对计算机的定位标识(有时也指地理位置)。</intro></course> <course id="9"><imgtitle>安装WordPress</imgtitle><title>第9章 安装WordPress</title><intro> 丰富的插件和模板是WordPress非常流行的一个特性。WordPress插件数据库中有超过18000个插件,包括SEO、控件等等。个人可以根据它的核心程序提供的规则自己开发模板和插件。这些插件可以快速地把你的博客改变成cms、forums、门户等各种类型的站点。</intro></course> <course id="10"><imgtitle>WordPress简单设置</imgtitle><title>第10章 WordPress简单设置</title><intro> WordPress 功能强大、扩展性强,这主要得益于其插件众多,易于扩充功能,基本上一个完整网站该有的功能,通过其第三方插件都能实现所有功能;</intro></course>
</infos>
九、课程界面逻辑代码
1、在com.boxuegu.view
包中新建一个CourseView
类,代码如下:
package com.boxuegu.view;import android.app.Activity;
import android.os.Handler;
import android.os.Message;
import android.support.v4.app.FragmentActivity;
import android.support.v4.view.ViewPager;
import android.util.DisplayMetrics;
import android.view.Display;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ListView;
import android.widget.RelativeLayout;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import com.boxuegu.R;
import com.boxuegu.adapter.AdBannerAdapter;
import com.boxuegu.adapter.CourseAdapter;
import com.boxuegu.bean.CourseBean;
import com.boxuegu.utils.AnalysisUtils;public class CourseView {public static final int MSG_AD_SLID = 002;private LayoutInflater mInflater;private FragmentActivity mContext;private ArrayList<CourseBean> cadl;private List<List<CourseBean>> cbl;private View mCurrentView;private ListView lv_list;private CourseAdapter adapter;private ViewPager adPager;private Handler mHandler;private AdBannerAdapter ada; //适配器private ViewPagerIndicator vpi; //小圆点private RelativeLayout adBannerLay; //广告条容器public CourseView(FragmentActivity context) {mContext = context;//为之后将Layout转化为view时用mInflater = LayoutInflater.from(context);}private void createView() {mHandler = new MHandler();initAdData();getCourseData();initView();new AdAutoSlidThread().start();}//获取课程信息private void getCourseData() {try {InputStream is = mContext.getResources().getAssets().open("chaptertitle.xml");cbl = AnalysisUtils.getCouresInfos(is);} catch (Exception e) {e.printStackTrace();}}//初始化广告的数据private void initAdData() {cadl = new ArrayList<CourseBean>();for (int i = 0; i < 3; i++) {CourseBean bean = new CourseBean();bean.id = (i + 1);switch (i) {case 0:bean.icon = "banner_1";break;case 1:bean.icon = "banner_2";break;case 2:bean.icon = "banner_3";break;default:break;}cadl.add(bean);}}private void initView() {mCurrentView = mInflater.inflate(R.layout.main_view_course, null);lv_list = (ListView) mCurrentView.findViewById(R.id.lv_list);adapter = new CourseAdapter(mContext);adapter.setData(cbl);lv_list.setAdapter(adapter);adPager = (ViewPager) mCurrentView.findViewById(R.id.vp_advertBanner);adPager.setLongClickable(false);ada = new AdBannerAdapter(mContext.getSupportFragmentManager(), mHandler);adPager.setAdapter(ada); adPager.setOnTouchListener(ada);vpi = (ViewPagerIndicator) mCurrentView.findViewById(R.id.vpi_advert_indicator);vpi.setCount(ada.getSize());adBannerLay = (RelativeLayout) mCurrentView.findViewById(R.id.rl_adBanner);adPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {@Overridepublic void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {}@Overridepublic void onPageSelected(int position) {if (ada.getSize() > 0) {vpi.setCurrentPosition(position % ada.getSize());}}@Overridepublic void onPageScrollStateChanged(int state) {}});resetSize();if (cadl != null) {if (cadl.size() > 0) {vpi.setCount(cadl.size());vpi.setCurrentPosition(0);}ada.setDatas(cadl);}}//计算控件大小private void resetSize() {int sw = getScreenWidth(mContext);int adLheight = sw / 2; //广告条高度ViewGroup.LayoutParams adlp = adBannerLay.getLayoutParams();adlp.width = sw;adlp.height = adLheight;adBannerLay.setLayoutParams(adlp);}//获取屏幕宽度private int getScreenWidth(Activity context) {DisplayMetrics displayMetrics = new DisplayMetrics();Display display = context.getWindowManager().getDefaultDisplay();display.getMetrics(displayMetrics);return displayMetrics.widthPixels;}//广告自动滑动private class AdAutoSlidThread extends Thread {@Overridepublic void run() {super.run();while (true) {try {sleep(5000);} catch (InterruptedException e) {e.printStackTrace();}if (mHandler != null) {mHandler.sendEmptyMessage(MSG_AD_SLID);}}}}//事件捕获private class MHandler extends Handler {@Overridepublic void dispatchMessage(Message msg) {super.dispatchMessage(msg);switch (msg.what) {case MSG_AD_SLID:if (ada.getCount() > 0) {adPager.setCurrentItem(adPager.getCurrentItem() + 1);}break;}}}public View getView() {if (mCurrentView == null) {createView();}return mCurrentView;}public void showView() {if (mCurrentView == null) {createView();}mCurrentView.setVisibility(View.VISIBLE);}
}
2、修改界面代码
(1)、找到AnalysisUtils.java
文件,在文件中添加一个解析XML
文件的方法。
public static List<List<CourseBean>> getCouresInfos(InputStream is) throws Exception{XmlPullParser parser = Xml.newPullParser();parser.setInput(is,"utf-8");List<List<CourseBean>> courseInfos=null;List<CourseBean> couresList = null;CourseBean courseInfo=null;int count=0;int type = parser.getEventType();while (type!=XmlPullParser.END_DOCUMENT){switch (type){case XmlPullParser.START_TAG:if ("infos".equals(parser.getName())){courseInfos=new ArrayList<List<CourseBean>>();couresList = new ArrayList<CourseBean>();}else if ("course".equals(parser.getName())){courseInfo = new CourseBean();String ids = parser.getAttributeValue(0);courseInfo.id = Integer.parseInt(ids);}else if ("imgtitle".equals(parser.getName())){String imgtitle = parser.nextText();courseInfo.imgTitle = imgtitle;}else if ("title".equals(parser.getName())){String title = parser.nextText();courseInfo.title = title;}else if ("intro".equals(parser.getName())){String intro = parser.nextText();courseInfo.intro = intro;}break;case XmlPullParser.END_TAG:if ("course".equals(parser.getName())){count++;couresList.add(courseInfo);if (count%2==0){courseInfos.add(couresList);couresList=null;couresList=new ArrayList<CourseBean>();}courseInfo=null;}break;}type=parser.next();}return courseInfos;}
(2)、修改底部导航栏,找到MainActivity.java
,在private ExercisesView mExerciseView;
下方添加:
private CourseView mCourseView;
(3)、找到MainActivity.java
,在注释//课程界面
的下方添加如下代码:
if (mCourseView == null){mCourseView = new CourseView(this);mBodyLayout.addView(mCourseView.getView());}else{mCourseView.getView();}mCourseView.showView();
十、运行效果
Android项目实战系列—基于博学谷 开源地址
Android项目实战系列—基于博学谷(七)课程模块(上)相关推荐
- android项目实战博学谷百度云,Android项目实战系列—基于博学谷(七)课程模块(下)...
由于这个模块内容较多,分为上.中.下 三篇博客分别来讲述,请耐心阅读. 课程模块分为四个部分 [ ] [课程列表]() [ ] [课程详情]() [x] [视频播放]() [x] [播放记录]() 课 ...
- Android项目实战系列—基于博学谷(七)课程模块(下)
由于这个模块内容较多,分为上.中.下 三篇博客分别来讲述,请耐心阅读. 课程模块分为四个部分 课程列表 课程详情 视频播放 播放记录 课程模块(下)主要讲述视频播放和播放记录两个部分 一.视频播放 1 ...
- android中私有方法 继承,Android项目实战系列—基于博学谷(五)个人资料
由于这个模块内容较多,篇幅较长,请耐心阅读. 个人资料模块分为两个部分 [x] [个人资料]() [x] [资料修改]() 一.个人资料 1.个人资料界面 (1).创建个人资料界面 在com.buxu ...
- android注册文件打开,Android项目实战系列—基于博学谷(三)注册与登录模块
由于这个模块内容较多,篇幅较长,请耐心阅读. 注册与登录模块分为三个部分 [x] [欢迎界面]() [x] [注册界面]() [x] [登录界面]() 一.欢迎界面 1.创建工程,命名为BoXueGu ...
- Android项目实战系列—基于博学谷(四)我的模块(上)
由于这个模块内容较多,篇幅较长,请耐心阅读. "我"的模块分为四个部分 我的界面 设置界面 修改密码界面 设置密保和找回密码 一."我"的界面 1.底部导航栏 ...
- android博学谷布局,Android项目实战系列—基于博学谷(四)我的模块(下)
image 由于这个模块内容较多,篇幅较长,请耐心阅读. "我"的模块分为四个部分 一.修改密码 1.创建修改密码界面 在com.boxuegu.activity包中,创建一个ja ...
- android博学谷实验报告,Android项目实战系列—基于博学谷(四)我的模块(上)...
image 由于这个模块内容较多,篇幅较长,请耐心阅读. "我"的模块分为四个部分 一."我"的界面 1.底部导航栏 (1).导入界面图片 将底部导航栏所需图片 ...
- android博学谷我的代码,Android项目实战系列—基于博学谷(四)我的模块(下)...
由于这个模块内容较多,篇幅较长,请耐心阅读. "我"的模块分为四个部分 [ ] [我的界面]() [ ] [设置界面]() [x] [修改密码界面]() [x] [设置密保和找回密 ...
- Android项目实战系列—基于博学谷(六)习题模块
由于这个模块内容较多,篇幅较长,请耐心阅读. 习题模块分为两个部分 习题列表界面 习题详情界面 一.习题列表界面 1.习题界面 (1).创建习题界面 在res/layout文件夹中,新建一个布局文件, ...
最新文章
- [转]各种编码ANSI、GB2312、GBK、GB18030、UNICODE以及UTF-8傻傻分不清!
- 一起谈.NET技术,NHibernate3.0剖析:Query篇之NHibernate.Linq标准查询
- 5888. 网络空闲的时刻
- keep-alive和多路复用
- HTML文件点放在手机桌面,如何把手机桌面上的文件发送到微信里
- windows无法安装iis信息服务器,windows server 2016 安装iis教程
- 《羊了个羊》创始人被母校制成展牌
- 计算机信息技术和网络技术的区别,信息技术计算机技术网络技术通信技术的区别与联系...
- keil5——安装教程附资源包
- 三角网格上高斯曲率和平均曲率
- 小波神经网络的基本原理,小波神经网络什么意思
- 按键精灵UI界面的实例代码以及调用
- 女人健身操必知的健康常识
- SEO文章配图自动生成工具软件
- 浏览器劫持解决:解决浏览器的捆绑问题
- vue3中进行vuex的分包管理(typescript)
- 使用 Vue3 + elementPlus 做一个每日习惯打卡表
- UltraEdit连接linux中文乱码,UltraEdit显示中文乱码的解决办法
- java实现远程登录RDP
- 超全面的构建合理的UI动效方法总结 !