(仿超级课程表)结合MaterialSheetFab实现简单的课程表功能

结合MaterialSheetFab实现简单的课程表功能

       一直觉得超级课程表的课表界面做的比较好,所以一直在探索想实现一个类似的功能,琢磨了一段时间,做了一个比较简陋的版本,不敢说是模仿超级课程表,因为一点都不像,但是还是费了些心思,在这里就当做下笔记。在此过程中也参考了许多前辈的经验,在此一并谢过。

话不多说,先上效果图:

1.课表数据来源于学校教务处,是真实数据:


顶部显示日期的地方有些错开了,但是这是模拟器的问题,在真机上并没有出现,所以没有处理。

2.由于我们学校的课程是分时段上的,比如1~8周是一门课程,9~17周又是另外一门课程,这里能根据当前周动态改变,当然这并不是重点,这是在解析数据时需要注意的地方,看效果图:


3.能够在空白地方长按添加课程,已有课程点击能够查看详细信息,并且能修改删除,上效果图:


做的比较简陋,但是作为一个新手,这样简陋的效果也花了很大心思,下边简单说下实现思路

a)在布局上主要是用了Linearlayout和ScrollView结合,顶部是Linearlayout,课程格子是ScrollView,在ScrollView里面包裹了一个RelativeLayout,然后在代码里面动态添加每一个课程的格子,课程格子是TextView。

b)数据是请求的教务处的真实课程数据,解析之后封装成一个个课程对象,把所有课程信息存储在本地,避免每次请求,然后根据当前周以及课程开始周、结束周、单双周等等信息,将课程信息动态设置给TextVeiw。贴上核心代码:

    /**
     * @param numWeek 周几
     * @param numDay  第几节
     * @param name    课程名
     * @param address 教室
     * @return
     */
    private void setCourse(final int numWeek, final int numDay, String name, String address) {

        // 添加课程信息
        TextView courseInfo = new TextView(getActivity());
        courseInfo.setText(name + "\n@" + address);
        // 该textview的高度根据其节数的跨度来设置
        RelativeLayout.LayoutParams rlp = new RelativeLayout.LayoutParams(aveWidth * 31 / 32, (gridHeight - 5));
        // textview的位置由课程开始节数和上课的时间(day of week)确定
        rlp.topMargin = 5 + (numDay - 1) * gridHeight;
        // rlp.leftMargin = 2;
        // 偏移由这节课是星期几决定
        rlp.addRule(RelativeLayout.RIGHT_OF, numWeek);
        // 字体剧中
        courseInfo.setGravity(Gravity.CENTER);
        // 设置一种背景
        courseInfo.setClickable(true);
        courseInfo.setBackgroundResource(background[(int) (Math.random() * background.length)]);// 0--15之间的随机数
//        courseInfo.setBackgroundResource(R.mipmap.ic_course_bg_bohelv);
        courseInfo.setTextSize(14);
        courseInfo.setLayoutParams(rlp);
        courseInfo.setTextColor(Color.WHITE);
        // 设置不透明度
        courseInfo.getBackground().setAlpha(222);
        courseInfo.setOnClickListener(new View.OnClickListener() {


            @Override
            public void onClick(View v) {
//                Toast.makeText(getActivity(), "周" + numWeek + "第" + numDay + "节", Toast.LENGTH_SHORT).show();
//           Toast.makeText()
                showCourseInfo(numWeek, numDay);
            }


        });
        courseInfo.setTag(numWeek + "," + numDay);

        course_table_layout.addView(courseInfo);
    }
c)处理每个格子的点击事件,空白格子点击之后,通过StartActivityforresult跳转到添加课程界面,填好信息之后返回,然后更新本地课程数据,最后更新UI上的课程信息,有课程的格子点击之后弹出课程详细信息,以及删除修改等等按钮,点击删除之后将本节课从列表中删除,点击修改之后,将现有课程信息封装,通过startactivityforresult跳转到修改课程信息界面,修改之后将新的信息返回并保存,然后再次更新UI界面。

关于右下角的一个按钮是使用了github上的一个开源控件,之前也写了一篇文章简单介绍用法,附上地址:MaterialSheetFab的详细使用方法

由于是一个完整的项目,源码不方便发出来只能附上课表UI代码,关于课表数据这块没什么好说的,逻辑代码也不是主要的,这里主要的是这个界面,附上源码:点击下载源码



你可能感兴趣的:(Android开发笔记)