码迷,mamicode.com
首页 > 移动开发 > 详细

Android课程表的实现

时间:2020-04-06 15:33:47      阅读:355      评论:0      收藏:0      [点我收藏+]

标签:定义   container   简单的   自己   对象   inf   老师   val   for   

Android课程表的实现

以往上课之前都要去相册找到本学期的课表截图,不然容易记不住要上啥课,但是总是去相册找又太麻烦了。恰巧这学期开了Android的课程,于是结合所学以及在网上搜集的资料,就写了一个课表Android小程序。借鉴了这个博客的思路,但百分之九十朝上的代码都是自己写的,有兴趣的也可以去看看原博主的思路。

一、截图展示

程序可以判断当前第几周,自动去除周次不在范围,以及单双周不匹配的课程。

技术图片

技术图片

二、程序思路

1、首先确定数据结构

技术图片

在这里最重要的就是上课时间的这个属性,我们按照特定规则的字符串,以此来存放上课时间,这样再按照特定的算法解析它。这样尽管一周有多节课程名相同,但是单双周或教室不一样的课程也只需要用一个对象来封装他。

如下,计算机信息安全课程,一周有两次课,我们用;分割不同上课时间的课程,然后再用:分割具体的上课时间与地点

技术图片

2、布局

然后将课表分为3个水平Linear layout,周次、星期、上课时间。然后上课时间分为8个垂直Linearlayout。

技术图片

3、具体实现

简单的描述一下,详细的可以直接看源代码。

组件首先初始化一下,因为周次标题和星期标签是固定的,所以只要初始化一次就行,课程数据暂不传递

/**
* 初始化视图
*/
private void initView(){
    preprocessorParam();
    //周次标题
    addWeekTitle(this);
    //星期标签
    addWeekLabel(this);
    //课程信息
    flushView(null, weekNum);
}

接着刷新布局函数,因为组件课程信息会根据周次的不同而产生变化,所以我们将它抽离成一个函数。

/**
     * 刷新课程视图
     * @param courseMap 课程数据
     * @param weekNum 周次
     */
private void flushView(Map<Integer, List<Course>> courseMap, long weekNum) {
    //初始化主布局
    if (null != mMainLayout) removeView(mMainLayout);
    mMainLayout = new LinearLayout(mContext);
    mMainLayout.setOrientation(HORIZONTAL);
    mMainLayout.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT));
    addView(mMainLayout);
    //周次标题
    mWeekTitle.setText("第 " + weekNum + " 周");
    //左侧节次标签
    addLeftNumber(mMainLayout);
    //课程信息
    if (null == courseMap) {//数据为空
        addVerticalTableLine(mMainLayout);
        TextView emptyLayoutTextView = createTextView("暂无数据!", titleSize, ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT, 0, getResources().getColor(R.color.textColor), Color.WHITE);
        mMainLayout.addView(emptyLayoutTextView);
    } else {//不为空
        for (int i = 1; i <= weeksNum; i++) {
            addVerticalTableLine(mMainLayout);
            addDayCourse(mMainLayout, courseMap, i);//添加单天要上的课程
        }
        addBottomButton();
    }
    invalidate();
}

还有上面函数中传递的Map<Integer, List<Course>> courseMap参数是根据本学期所有课程解析出来本周要上的课程。

最后在activity中根据id找到这个控件,并加载一下数据。

/**
     * 加载数据
     *
     * @param courses
     */
public void loadData(List<Course> courses, Date date) {
    this.courseList = courses;
    this.startDate = date;
    weekNum = calcWeek(startDate);
    handleData(courseMap, courses, weekNum);
    flushView(courseMap, weekNum);
}

在这个方法就可以通过handleData方法,将传递的课程List集合数据解析成本周要上的课程,并填充到map中,然后再调用flushView方法刷新一下布局。

三、问题

这个程序的上课信息都是写死在代码中的,更换课表还要修改源代码。本想着使用SQLite存储数据,然后再新建一个布局可以自定义数据,但是老师还没教到这,而且要准备复习不能花太多时间在计算机上。所以以后有机会再慢慢加内容。

——————

这个博客写的是相当简略,感兴趣的话可以参考源代码

源代码:https://github.com/HeMOua/timetable

Android课程表的实现

标签:定义   container   简单的   自己   对象   inf   老师   val   for   

原文地址:https://www.cnblogs.com/hemou/p/12641871.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!