转载请注明出处:http://blog.csdn.net/hmyang314/article/details/52092446

CourseTableLayout

一个Android自动生成课程表的自定义控件

GitHub:https://github.com/HMY314/CourseTableLayout


一、介绍

    1、根据传入课程数据,或日期数据、时间数据,动态显示课程表;    2、顶部日期行的显示样式可以自定义,空课程、课程的内容及背景也可自定义;    3、第一列,及时间列的宽度可以设置,默认为0,则宽度与课程格子的宽度相同,内容与背景也可以自定义;    4、当课程页面超出手机屏幕高度时,可以上下滑动,改变数据可刷新控件就可以更新界面;

二、使用方法

1、核心类是CourseTableLayout,继承自LinearLayout的抽象类,所以我们实际项目使用需要继承它,这里使用了泛型,试课程表使用更加灵活,并要实现对应的抽象方法,如下:

    public abstract class CourseTableLayout extends LinearLayout {    //******************************其他代码省略**************************            /**             * 判断该课程是否是当前时间的课程             *             * @param course             * @param dayPosition             * @param timePosition             * @return 返回boolean 数组长度为2,             * boolean[0]:true 代表该课程是当前时间点的课程,boolean[1]:true 代表当前时间点是上面的连续课程             */            protected abstract boolean[] compareToCourse(T course, int dayPosition, int timePosition);            /**             * 对左上角第一个TextView自定义显示             *             * @param firstTextView             */            protected void showFirstTextView(TextView firstTextView) {            }            /**             * 显示空课程(默认文本已显示,这里用于自定义效果)             */            protected void showEmptyCourse(TextView textView, int dayPosition, int timePosition, int oneTableWidth, int oneTableHeight) {            }            /**             * 显示课程到控件,并且需要根据课程节数改变控件高度             *             * @param textView             * @param course         课程数据             * @param oneTableWidth  一个课程控件宽度             * @param oneTableHeight 一个课程控件高度             */            protected abstract void showCourse(TextView textView, T course, int dataPosition, int dayPosition, int timePosition, int oneTableWidth, int oneTableHeight);            /**             * 自定义日期文本             *             * @param textView             * @param dayPosition             * @param dayLabel             */            protected void customDayText(TextView textView, int dayPosition, String dayLabel) {            }            /**             * 自定义时间文本             *             * @param textView             * @param timePosition             * @param timeLabel             */            protected void customTimeText(TextView textView, int timePosition, String timeLabel) {            }            protected abstract void onClickEmptyCourse(TextView textView, int dayPosition, int timePosition);            protected abstract void onClickCourse(TextView textView, T course, int dataPosition, int dayPosition, int timePosition);    }

2、我这里用courseTableTestLayout继承CourseTableLayout实现,数据模型用CourseModel实体,这个根据具体业务可灵活更改。

    public class CourseModel implements Serializable {        private static final long serialVersionUID = 1L;        public int week;        public String name;        /**         * 开始上课节次         */        public int start;        /**         * 共几节课         */        public int step;    }    public class courseTableTestLayout extends CourseTableLayout {        private int BG_COURSE[] = new int[]{R.drawable.bg_course_table_blue_selector, R.drawable.bg_course_table_green_selector,                R.drawable.bg_course_table_red_selector};        private OnClickCourseListener mOnClickCourseListener;        public courseTableTestLayout(Context context, AttributeSet attrs) {            super(context, attrs);            initData();        }        public courseTableTestLayout(Context context) {            super(context);            initData();        }        private void initData() {            setIsShowDefault(true);        }        @Override        protected boolean[] compareToCourse(CourseModel course, int dayPosition, int timePosition) {            boolean[] result = new boolean[2];            if (course.week == dayPosition + 1 && course.start == timePosition + 1) {                result[0] = true;            }            return result;        }        @Override        protected void showCourse(TextView textView, CourseModel course, int dataPosition, int dayPosition, int timePosition, int oneTableWidth, int oneTableHeight) {            textView.setBackgroundResource(R.drawable.bg_course_table_blue_selector);        }        @Override        protected void customDayText(TextView textView, int dayPosition, String dayLabel) {        }        @Override        protected void onClickEmptyCourse(TextView textView, int dayPosition, int timePosition) {            if (mOnClickCourseListener != null) {                mOnClickCourseListener.onClickEmptyCourse(textView, dayPosition, timePosition);            }        }        @Override        protected void onClickCourse(TextView textView, CourseModel course, int dataPosition, int dayPosition, int timePosition) {            if (mOnClickCourseListener != null) {                mOnClickCourseListener.onClickCourse(textView, course, dataPosition, dayPosition, timePosition);            }        }        public void setOnClickCourseListener(OnClickCourseListener listener) {            mOnClickCourseListener = listener;        }        public interface OnClickCourseListener {            void onClickCourse(TextView textView, CourseModel course, int dataPosition, int dayPosition, int timePosition);            void onClickEmptyCourse(TextView textView, int dayPosition, int timePosition);        }    }

3、在xml中实现

                

4、使用:

    List mList = getData();//课程数据    CourseTableTestLayout mCourseTableTestLayout = (CourseTableTestLayout) findViewById(R.id.layout_course);    //其他设置方法请在代码中查看    mCourseTableTestLayout.setData(mList);    //刷新界面这样调用    mCourseTableTestLayout.notifyDataSetChanged();


更多相关文章

  1. A06_RelativeLayout的属性设置
  2. RelativeLayout && inflate
  3. 【Android(安卓)开发】:UI控件之显示图片控件 ImageView 的使用方
  4. Android之UI学习篇十一:ListView控件学习(一)
  5. Android(安卓)UI开发点点滴滴(基本控件)
  6. Android中的selector
  7. Android:控件AutoCompleteTextView 客户端保存搜索历史自动提示
  8. android 日期时间选择器
  9. 布局(2、相对布局)

随机推荐

  1. Android(安卓)核心分析 之七------Servic
  2. Android异步处理
  3. Google解密携手宏达电:确保Android一炮打
  4. Android(java)学习笔记135:Android中assets
  5. android中延迟执行某个任务
  6. 记录一下八款开源 Android(安卓)游戏引擎
  7. Android(安卓)之 Project Butter 详细介
  8. Android多媒体学习一:Android中Image的简
  9. Android开发环境的搭建
  10. android手机通过串口蓝牙透传模块与AVR单