Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

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

Notifications You must be signed in to change notification settings

HMY314/CourseTableLayout

Repository files navigation

CourseTableLayout

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

CSDN:http://blog.csdn.net/hmyang314/article/details/52076392


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


##二、使用方法

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

 public abstract class CourseTableLayout<T> 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<CourseModel> {
 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中实现

 <com.hmy.coursetablelayout.view.CourseTableTestLayout
 android:id="@+id/layout_course"
 android:layout_width="match_parent"
 android:layout_height="wrap_content"
 android:layout_marginTop="5dp">
 </com.hmy.coursetablelayout.view.CourseTableTestLayout>

4、使用:

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

About

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

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

AltStyle によって変換されたページ (->オリジナル) /