Android课程表的设计开发

Android课程表的设计开发

导语

实现了教务系统中课程的导入,分类显示课程。学期的修改,增加,修改。课程按照周的显示。课程修改上课星期和上课周。上课课程的自动归类。

一、主要功能界面

开发过程

一开始因为毕设有关课程表的要求不明,主要就是利用jsoup拉取学校教务管理系统的课程数据进行课程表界面的填充显示,并不能课程的个性化调整。

后来重新调整了需求,参考了超级课程表的功能。重新设计了实体类,利用bmob移动端云作为爬取到的数据的数据服务器进行了重新的开发。

主要代码

1、课程实体类
package com.mangues.coursemanagement.bean;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import cn.bmob.v3.BmobObject;

public class CourseBean extends BmobObject implements Serializable {
    public static final String TAG = "CourseBean";

    private String studentId;
    private String dataYear;
    private String dataTerm;

    private String courseName = "";  //课程名
    private String courseRoom = "";   //教室
    private String courseTeacher = "";  //老师
    //private String courseWeekNumber = "0";
    private ArrayList<Integer> courseWeekNumber = new ArrayList<>(); //周数
    private int courseWeek = 0;   //星期几上课
    private int courseLow = 0;   //第几排
    private int courseSection = 0;    //延续几节课
    //private String courseSection = "12";   //第几节上课1,2,12(2节课)
    //private String courseIn = "3";    //单双周    1(单),2(双),3(全)
    public CourseBean() {
        super();
    }

    public void setCourseBase(String studentId, String dataYear, String dataTerm) {
        this.studentId = studentId;
        this.dataYear = dataYear;
        this.dataTerm = dataTerm;
    }

    public CourseBean(String courseName, String courseRoom, String courseTeacher, ArrayList<Integer> courseWeekNumber, int courseWeek, int courseLow, int courseSection) {
        this.courseName = courseName;
        this.courseRoom = courseRoom;
        this.courseTeacher = courseTeacher;
        this.courseWeekNumber = courseWeekNumber;
        this.courseWeek = courseWeek;
        this.courseLow = courseLow;
        this.courseSection = courseSection;
    }

    /**
     * str 数据到bean
       * @Name: stringToBean
       * @param str
       * @return
       * @Time: 2015-12-21 上午11:00:57
       * @Return: CourseBean
     */
    public static CourseBean stringToBean(String str) {
        return toBean(str);
    }

    //辅助
    private static CourseBean toBean(String courseDatas){
        CourseBean bean = null;
        String[] courseData = courseDatas.split("◇");
        if(courseData.length>3){   //有数据
            bean = new CourseBean();
            String courseName = courseData[0];
            String courseRoom = courseData[2];
            //获取上课周数
            findWeekNumberFromStr(courseData[1],bean);
            bean.setCourseName(courseName);
            bean.setCourseRoom(courseRoom);
            findCourseInFromStr(courseData[4],bean);
        }
        return bean;
    }

    /**
     *   找出上课周数,老师名字
       * @Name: findFromStr
       * @return
       * @Time: 2015-12-21 上午11:22:30
       * @Return: String
     */
    public static void findWeekNumberFromStr(String courseData,CourseBean bean){
        Pattern pattern = Pattern.compile("(\\w*)\\((\\d+)-(\\d+)\\)");
        Matcher matcher = pattern.matcher(courseData);
        if(matcher.find()){
          String teacher =  matcher.group(1);
          bean.setCourseTeacher(teacher);
          String weekNumberstart =  matcher.group(2);
          String weekNumberfinish =  matcher.group(3);
            Integer weekNumberstartInt = Integer.parseInt(weekNumberstart);
            Integer weekNumberfinishInt = Integer.parseInt(weekNumberfinish);
            for (int i = weekNumberstartInt;i<=weekNumberfinishInt;i++){
                bean.getCourseWeekNumber().add(i);
            }
        }
    }

    /**
     *   找出 上课是不是单双周,几节课
       * @Name: findCourseInFromStr
       * @param courseData
       * @return
       * @Time: 2015-12-21 下午1:29:05
       * @Return: String
     */
    public static void findCourseInFromStr(String courseData,CourseBean bean){
        Pattern pattern = Pattern.compile("(\\w*)\\{(\\d*)节\\}");
        Matcher matcher = pattern.matcher(courseData);
        if(matcher.find()){
          String str =  matcher.group(1);
            ArrayList<Integer> list = bean.getCourseWeekNumber();
          switch (str) {
               case "单周":
                   for (int i = 0;i< list.size();i++){
                       Integer weekNumber = list.get(i);
                       if (weekNumber%2==0){  //移除偶数
                           bean.getCourseWeekNumber().remove(i);
                       }
                   }
                   break;
               case "双周":
                   for (int i = 0;i< list.size();i++){
                       Integer weekNumber = list.get(i);
                       if (weekNumber%2!=0){  //移除奇数
                           bean.getCourseWeekNumber().remove(i);
                       }
                   }
                    break;
               default:
                   break;
         }
            String str2 =  matcher.group(2);
            String[] args = str2.split("");
            if (args.length==3){
                Integer integer = Integer.parseInt(args[1]);
                Integer integer2 = Integer.parseInt(args[2]);
                bean.setCourseLow(integer);
                bean.setCourseSection(integer2-integer+1);

            }else if (args.length==4){
                Integer integer = Integer.parseInt(args[1]);
                Integer integer2 = Integer.parseInt(args[2]+args[3]);
                bean.setCourseLow(integer);
                bean.setCourseSection(integer2-integer+1);

            }else if (args.length==5){
                Integer integer = Integer.parseInt(args[1]+args[2]);
                Integer integer2 = Integer.parseInt(args[3]+args[4]);
                bean.setCourseLow(integer);
                bean.setCourseSection(integer2-integer+1);

            }else if (args.length==2){
                Integer integer = Integer.parseInt(args[1]);
                bean.setCourseLow(integer);
                bean.setCourseSection(1);
            }

        }
    }

    public String getCourseName() {
        return courseName;
    }

    public void setCourseName(String courseName) {
        this.courseName = courseName;
    }

    public String getCourseRoom() {
        return courseRoom;
    }

    public void setCourseRoom(String courseRoom) {
        this.courseRoom = courseRoom;
    }

    public String getCourseTeacher() {
        return courseTeacher;
    }

    public void setCourseTeacher(String courseTeacher) {
        this.courseTeacher = courseTeacher;
    }

    public ArrayList<Integer> getCourseWeekNumber() {
        return courseWeekNumber;
    }

    public void setCourseWeekNumber(ArrayList<Integer> courseWeekNumber) {
        this.courseWeekNumber = courseWeekNumber;
    }

    public int getCourseWeek() {
        return courseWeek;
    }

    public void setCourseWeek(int courseWeek) {
        this.courseWeek = courseWeek;
    }

    public int getCourseLow() {
        return courseLow;
    }

    public void setCourseLow(int courseLow) {
        this.courseLow = courseLow;
    }

    public int getCourseSection() {
        return courseSection;
    }

    public void setCourseSection(int courseSection) {
        this.courseSection = courseSection;
    }

    public String getStudentId() {
        return studentId;
    }

    public void setStudentId(String studentId) {
        this.studentId = studentId;
    }

    public String getDataYear() {
        return dataYear;
    }

    public void setDataYear(String dataYear) {
        this.dataYear = dataYear;
    }

    public String getDataTerm() {
        return dataTerm;
    }

    public void setDataTerm(String dataTerm) {
        this.dataTerm = dataTerm;
    }
}
2、课程归类处理

    //按天查询数据
    private void getDayDate(List<CourseBean> list){
        boolean boo = SaveUtil.getSharedPreferencesSwitch(mContext);
        ArrayList<CourseBean> integerA = new ArrayList<>();
        if (boo){
            if (weekNum!=-1){
                for (int l=0;l<list.size();l++){     //去除
                    ArrayList<Integer> integerArrayList = list.get(l).getCourseWeekNumber();
                    if (!integerArrayList.contains(weekNum)){  //不包含,就是不是本周,去除
                        integerA.add(list.get(l));
                    }
                }
                    list.removeAll(integerA);

            }
        }

        List<CourseBean> list1  = null;
        Map<Integer,List<CourseBean>> map = new HashMap<>();

        for (CourseBean be :list) {

            Integer weekNum = be.getCourseWeek();
            if (map.containsKey(weekNum)){  //有数据
                list1 = map.get(weekNum);
            }else {
                list1 = new ArrayList<>();
                map.put(weekNum,list1);
            }
            list1.add(be);
        }

        ArrayList<CourseBeanMap> ls = new ArrayList<>();

        //按星期几处理
        for (Map.Entry<Integer,List<CourseBean>> entry : map.entrySet()) {
            List<CourseBeanMap>  mapw = handleRepeat(entry.getValue(),entry.getKey());
                ls.addAll(mapw);

        }

        //本地存储存储使用
        TimeTableBmob bmob = new TimeTableBmob();
        bmob.setStudentId(CourseApplication.getInstance().getUserInfo().getStudentId());
        bmob.setCourseList(ls);
        bmob.setTerm(dataTerm);
        bmob.setYear(dataYear);
        CourseApplication.getInstance().setTimeTableBmob(bmob);

        dataBack.onDataBack(ls);
    }

    //处理重复
    private List<CourseBeanMap>  handleRepeat(List<CourseBean> list,Integer weekNum){

        Collections.sort(list,new Comparator<CourseBean>(){
            public int compare(CourseBean arg0, CourseBean arg1) {
                Integer year1 = arg0.getCourseLow();
                Integer year2 = arg1.getCourseLow();
                return year1.compareTo(year2);
            }
        });

        List<CourseBeanMap> listKey = new ArrayList<>();
        List<String> liststr = new ArrayList<>();

        int size = list.size();

            for (int h=0;h<list.size();h++){
                CourseBean bean = list.get(h);
                Integer low = bean.getCourseLow();
                Integer sesson = bean.getCourseSection();
                Boolean isAdd = false;

                for (int kk=0;kk<listKey.size();kk++){

                    String key = liststr.get(kk);
                    String[] keys = key.split("-");//
                    Integer low1 =Integer.parseInt(keys[0]);//3
                    Integer sesson1 =Integer.parseInt(keys[1]);//2

                    if ((low1+sesson1-1)>=low){   //包含在内
                        isAdd = true;
                        CourseBeanMap cousermap = listKey.get(kk);
                        cousermap.setCourseLow(low1);
                        cousermap.setCourseWeek(weekNum);
                        cousermap.setCourseSection(sesson+low-low1);
                        liststr.set(kk,low1+"-"+(sesson+low-low1));//修改key值
                        cousermap.add(bean);
                    }
                }

                if (isAdd==false){
                    CourseBeanMap cousermap = new CourseBeanMap();
                    cousermap.setCourseLow(low);
                    cousermap.setCourseWeek(weekNum);
                    cousermap.setCourseSection(sesson);
                    cousermap.add(bean);
                    listKey.add(cousermap);
                    liststr.add(low+"-"+sesson);
                }
            }

        return listKey;
    }
3.课程表界面

利用了网上找到的一段代码进行部分修改完成

    //初始化课程表界面
  private void initTable() {
        // 获得列头的控件
        empty = (TextView) this.findViewById(R.id.test_empty);
        monColum = (TextView) this.findViewById(R.id.test_monday_course);
        tueColum = (TextView) this.findViewById(R.id.test_tuesday_course);
        wedColum = (TextView) this.findViewById(R.id.test_wednesday_course);
        thrusColum = (TextView) this.findViewById(R.id.test_thursday_course);
        friColum = (TextView) this.findViewById(R.id.test_friday_course);
        satColum = (TextView) this.findViewById(R.id.test_saturday_course);
        sunColum = (TextView) this.findViewById(R.id.test_sunday_course);
        course_table_layout = (RelativeLayout) this
                .findViewById(R.id.test_course_rl);
        course_table_layout.removeAllViews();  //清楚页面数据
        DisplayMetrics dm = new DisplayMetrics();
        getWindowManager().getDefaultDisplay().getMetrics(dm);
        // 屏幕宽度
        int width = dm.widthPixels;
        // 平均宽度
        int aveWidth = width / 8;
        // 第一个空白格子设置为25宽
        empty.setWidth(aveWidth * 3 / 4);
        monColum.setWidth(aveWidth * 33 / 32 + 1);
        tueColum.setWidth(aveWidth * 33 / 32 + 1);
        wedColum.setWidth(aveWidth * 33 / 32 + 1);
        thrusColum.setWidth(aveWidth * 33 / 32 + 1);
        friColum.setWidth(aveWidth * 33 / 32 + 1);
        satColum.setWidth(aveWidth * 33 / 32 + 1);
        sunColum.setWidth(aveWidth * 33 / 32 + 1);
        this.screenWidth = width;
        this.aveWidth = aveWidth;
        int height = dm.heightPixels;
        gridHeight = height / 12;
        // 设置课表界面
        // 动态生成12 * maxCourseNum个textview
        for (int i = 1; i <= 12; i++) {

            for (int j = 1; j <= 8; j++) {

                TextView tx = new TextView(mContext);
                tx.setId((i - 1) * 8 + j);
                // 除了最后一列,都使用course_text_view_bg背景(最后一列没有右边框)
                if (j < 8)
                    tx.setBackgroundDrawable(mContext.getResources()
                            .getDrawable(R.drawable.course_text_view_bg));
                else
                    tx.setBackgroundDrawable(mContext.getResources()
                            .getDrawable(R.drawable.course_table_last_colum));
                // 相对布局参数
                RelativeLayout.LayoutParams rp = new RelativeLayout.LayoutParams(
                        aveWidth * 33 / 32 + 1, gridHeight);
                // 文字对齐方式
                tx.setGravity(Gravity.CENTER);
                // 字体样式
                tx.setTextAppearance(mContext, R.style.courseTableText);
                // 如果是第一列,需要设置课的序号(1 到 12)
                if (j == 1) {
                    tx.setAlpha(0.3f);
                    tx.setText(String.valueOf(i));
                    rp.width = aveWidth * 3 / 4;
                    // 设置他们的相对位置
                    if (i == 1)
                        rp.addRule(RelativeLayout.BELOW, empty.getId());
                    else
                        rp.addRule(RelativeLayout.BELOW, (i - 1) * 8);
                } else {
                    tx.setAlpha(0f);
                    rp.addRule(RelativeLayout.RIGHT_OF, (i - 1) * 8 + j - 1);
                    rp.addRule(RelativeLayout.ALIGN_TOP, (i - 1) * 8 + j - 1);
                    tx.setText("");
                }

                tx.setLayoutParams(rp);
                course_table_layout.addView(tx);
            }
        }
    }

//数据填充
private void setCourseData(final CourseBeanMap map, final int index) {
        final CourseBean bean = map.returnfirstTrue(weekNum);

        // 添加课程信息
        TextView courseInfo = new TextView(mContext);
        courseInfo.setText(bean.getCourseName() + "@" + bean.getCourseRoom());
        // 该textview的高度根据其节数的跨度来设置
        RelativeLayout.LayoutParams rlp = new RelativeLayout.LayoutParams(

                aveWidth * 31 / 32, (gridHeight - 5) * map.getCourseSection());
        // textview的位置由课程开始节数和上课的时间(day of week)确定
        rlp.topMargin = 5 + (map.getCourseLow() - 1) * gridHeight;
        rlp.leftMargin = 1;
        // 偏移由这节课是星期几决定
        rlp.addRule(RelativeLayout.RIGHT_OF, map.getCourseWeek());
        // 字体剧中
        courseInfo.setGravity(Gravity.CENTER);
        // 设置一种背景
        final int back;
        final int huiback;
        if (map.isDoubleBean()) {// 有单双周
            back = ColorDrawable.getCourseBgMulti(map.getCourseLow(),
                    map.getCourseWeek());
            huiback = ColorDrawable.grayColorMulti;
        } else {
            back = ColorDrawable.getCourseBg(map.getCourseLow(),
                    map.getCourseWeek());
            huiback = ColorDrawable.grayColor;
        }
        if (map.returntTrue(weekNum)){
            courseInfo.setBackgroundResource(back);
        }else {
            courseInfo.setBackgroundResource(huiback);
        }

        courseInfo.setTextSize(12);
        courseInfo.setLayoutParams(rlp);
        courseInfo.setTextColor(Color.WHITE);
        // 设置不透明度
        courseInfo.getBackground().setAlpha(222);
        final int upperCourseIndex = 0;
        // 设置监听事件
        courseInfo.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View arg0) {
                if (map.isDoubleBean()) {// 大于双数
                    // 如果有多个课程,则设置点击弹出gallery 3d 对话框
                    // LayoutInflater layoutInflater =
                    // (LayoutInflater)mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                    View galleryView = layoutInflater.inflate(
                            R.layout.course_info_gallery_layout, null);
                    final Dialog coursePopupDialog = new AlertDialog.Builder(
                            mContext).create();
                    coursePopupDialog.setCanceledOnTouchOutside(true);
                    coursePopupDialog.setCancelable(true);
                    coursePopupDialog.show();
                    WindowManager.LayoutParams params = coursePopupDialog
                            .getWindow().getAttributes();
                    params.width = WindowManager.LayoutParams.FILL_PARENT;
                    coursePopupDialog.getWindow().setAttributes(params);

                    DisplayMetrics dm = new DisplayMetrics();
                    getWindowManager().getDefaultDisplay()
                            .getMetrics(dm);
                    // 屏幕宽度
                    int width = dm.widthPixels;

                    CourseInfoAdapter adapter = new CourseInfoAdapter(mContext,
                            map, width, back,weekNum);
                    CourseInfoGallery gallery = (CourseInfoGallery) galleryView
                            .findViewById(R.id.course_info_gallery);
                    gallery.setSpacing(10);
                    gallery.setAdapter(adapter);
                    gallery.setSelection(upperCourseIndex);
                    gallery.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                        @Override
                        public void onItemClick(AdapterView<?> arg0, View arg1,
                                                int arg2, long arg3) {
                            CourseBean bean = map.get(arg2);
                            Intent intent = new Intent(mContext,CourseInfoActivity.class);
                            Bundle mBundle = new Bundle();
                            mBundle.putSerializable(CourseBean.TAG, bean);
                            mBundle.putInt("index", index);
                            mBundle.putInt("courseBeanIndex", arg2);
                            intent.putExtras(mBundle);
                            startActivity(intent);
                            coursePopupDialog.cancel();
                        }
                    });
                    coursePopupDialog.setContentView(galleryView);
                }else { //没有单双周
                    Intent intent = new Intent(mContext,CourseInfoActivity.class);
                    Bundle mBundle = new Bundle();
                    mBundle.putInt("index", index);
                    mBundle.putInt("courseBeanIndex", 0);
                    mBundle.putSerializable(CourseBean.TAG, bean);
                    intent.putExtras(mBundle);
                    startActivity(intent);
                }
            }

        });
        course_table_layout.addView(courseInfo);
    }
时间: 2024-10-07 04:06:37

Android课程表的设计开发的相关文章

Android软硬整合设计与框架揭秘: HAL&amp;Framework &amp;Native Service &amp;App&amp;HTML5架构设计与实战开发

掌握Android从底层开发到框架整合技术到上层App开发及HTML5的全部技术: 一次彻底的Android架构.思想和实战技术的洗礼: 彻底掌握Andorid HAL.Android Runtime.Android Framework.Android Native Service.Android Binder.Android App.Android Testing.HTML5技术的源泉和精髓等核心技术,不仅仅是技术和代码本身,更重要的是背后的设计思想和商业哲学. 一.课程特色 l  贯通And

Android软硬整合设计与框架揭秘: HAL&amp;Framework &amp;Native Service &amp;App&amp;Browser架构设计与实战开发

在软硬整合领域, Android以其对软件和硬件的高度开放性引领了当今的软硬整合潮流,全世界正在进行一场轰轰烈烈的Android运动,Android以不可思议的速度渗透越来越广的领域,Android智能手机.Android智能电视.Android微波炉.Android平板电脑.Android智能机器人.Android车载系统等越来越多的Android产品涌入人们的工作和生活中,自从Google的[email protected]战略发布以来,更是让世界对Android充满了怦然心动的期待,可以预

【移动终端软件开发】2017-2018秋学期教材《Android移动应用设计与开发(第2版)——基于Android Studio开发环境》

经过仔细比较,最终选定2017-2018秋季教材: <Android移动应用设计与开发(第2版)——基于Android Studio开发环境> 出版日期:2017-03-01  书号:978-7-115-44780-7  定价:49.80 元   页数:268 第1章 Android简介 11.1 Android发展概述 11.2 配置开发环境 31.2.1 安装JDK 31.2.2 安装Android Studio 51.2.3 安装SDK 51.3 本章小结 7习题 7 第2章 Andro

Android通用框架设计与完整电商APP开发

第1章 课程介绍及APP效果展示(Java版)本章概述了本课程大家能学到什么,老师如何讲解,为什么这么讲解,并介绍了框架的整体架构设计与模块分解,最后展示了用自己设计的框架开发出来的完整电商APP的效果图(服务端API快速搭建教程:http://www.imooc.com/article/19001) ...1-1 课程导学1-2 项目架构设计与模块分解 第2章 项目初始化本章将从零搭建一个空项目,实践项目搭建的过程,并额外教大家搭建一个基于Go语言的Web版Git服务器,实现代码托管的自举.(

企业级Android应用架构设计与开发 完整版

第1章 课程导学与准备工作本章主要介绍为何要学习企业级的架构设计开发,以及本门课能为我们带来哪些收获.之后会为大家介绍本课程内容具体安排,最后给出如何学好这门课程的一些学习建议.希望大家都能通过这门课程,学有所成,学有所归. 第2章 企业级工程架构分析本章将带领大家依次从传统.模块化.组件化架构模型分析开始,对比它们各自的优缺点,最终我们会采用企业中普遍应用的组件化架构模型开发我们的实战项目,在快速掌握企业级工程架构模型的同时为后面实战项目的开发学习做好准备.大家加油~... 第3章 实战项目需

android课程表控件、悬浮窗、Todo应用、MVP框架、Kotlin完整项目源码

Android精选源码 Android游戏2048 MVP Kotlin项目(RxJava+Rerotfit+OkHttp+Glide) Android基于自定义Span的富文本编辑器 android课程表控件效果源码 Dagger.Clean.MVP框架搭建,快速开发- Andorid 任意界面悬浮窗,实现悬浮窗如此简单 android模仿QQ登录后保存账号和密码效果源码 Android简洁清爽的Todo清单工具(MVP+okhttp3+retrofit+gson) Android优质博客 K

Android App的设计架构:MVC,MVP,MVVM与架构经验谈

来源: Android App的设计架构:MVC,MVP,MVVM与架构经验谈 和MVC框架模式一样,Model模型处理数据代码不变在Android的App开发中,很多人经常会头疼于App的架构如何设计: 我的App需要应用这些设计架构吗? MVC,MVP等架构讲的是什么?区别是什么? 本文就来带你分析一下这几个架构的特性,优缺点,以及App架构设计中应该注意的问题. 1.架构设计的目的 通过设计使程序模块化,做到模块内部的高聚合和模块之间的低耦合.这样做的好处是使得程序在开发的过程中,开发人员

第二章 Android系统与嵌入式开发

第二章 Android系统与嵌入式开发 第二章首先要先了解Android和嵌入式Lnux系统有什么区别和联系,嵌入式Linux系统是在嵌入式设备中运行Linux系统:Android系统是在嵌入式设备中运行Android系统. 其区别就是Android系统和Linux系统的区别.Android系统的底层是Linux的内核,上面跑的是Android的java虚拟机.Android系统的UI做的比Lnux好很多. 首先我们应该先了解一下什么是嵌入式,对于嵌入式来说,它是一种“完全嵌入受控器件内部,为特

Android应用插件式开发解决方法

Android应用插件式开发解决方法 一.现实需求描述 一般的,一个Android应用在开发到了一定阶段以后,功能模块将会越来越多,APK安装包也越来越大,用户在使用过程中也没有办法选择性的加载自己需要的功能模块.此时可能就需要考虑如何分拆整个应用了. 二.解决方案提出 一般有两种方式,一种是将应用按照功能分拆成多个应用,用户需要哪个就下载哪个,都需要就都下载.应用之间,可以在代码层面做一定的关联,以共享部分信息.另一种方式,类似于其他平台插件的方式,用户可以在主应用中可以选择性的下载需要的插件