Android:CourseTableLayout — 好用的Android自动生成课程表的自定义控件
16lz
2021-01-23
转载请注明出处: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();
更多相关文章
- 【Android 开发】:UI控件之显示图片控件 ImageView 的使用方法
- Android之UI学习篇十一:ListView控件学习(一)
- Android UI开发点点滴滴(基本控件)
- Android:控件AutoCompleteTextView 客户端保存搜索历史自动提示
- android xml 常用控件介绍
- Android控件之ImageView,Button, ImageButton
- Android Button 控件绑定单击事件
- Android专家课程——课后小记