> 本文中的功能介绍、控件用法均针对v2.0.2
以其以上,你可以在 ChangeLog 查看本控件的开发进展,作者联系方式1193600556@qq.com
TimetableView是一款开源的、完善、高效的Android课程表控件。高效在哪?周次切换高效、样式文件极少(只需1个,v1.x
需要36个只能实现12种样式)
- 支持xml设置属性
- 丰富的课程工具包
- 支持多种自定义
- 课程颜色管理
- 调用简洁、性能高效
- ScrollView可替换
- 可设置背景以及透明度
- 数据源可添加额外信息
目录
准备数据源
在开始使用控件之前,你需要准备好数据源,数据可以从网上获取或者使用本地数据,为了方便演示,使用本地的JSON字符串,然后再将其解析为需要的格式
参见 MySubject、SubjectExtras、SubjectRepertory
基础功能
本节你将掌握如何使用本控件搭建自己的课表界面。这里使用的版本为
2.0.2
虽说本节名字为基础功能
,但是这是一个综合的例子,如果有些地方看不明白或者属性记不住,那么这是正常的,看到下文对应的章节时会清晰很多,如果仍然不懂请联系我~
完整代码参见 BaseFuncActivity
添加依赖
Gradle
compile 'com.zhuangfei:TimetableView:2.0.2'
Maven
<dependency>
<groupId>com.zhuangfei</groupId>
<artifactId>TimetableView</artifactId>
<version>2.0.2</version>
<type>pom</type>
</dependency>
添加控件
该控件包含的基础组件有日期栏、侧边栏、课表视图,在布局文件中加入如下代码后会包含这三个基础组件,注意要添加背景色,没有背景图片可以添加白色背景。
<com.zhuangfei.timetable.view.WeekView
android:id="@+id/id_weekview"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
<com.zhuangfei.timetable.TimetableView
android:id="@+id/id_timetableView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/bg3">
</com.zhuangfei.timetable.TimetableView>
数据源设置
数据源的设置方式有两种,以下分别来介绍:
方法1:使用指定的格式List<Schedule>
,Schedule
是控件提供的课程实体类,你可以将自己的数据封装为指定格式,然后进行如下配置即可
mTimetableView.data(scheduleList)
.curWeek(1)
.showView();
方法2:方法1在很多场景下都满足不了需求,往往需要定义自己的课程实体类,你可以跟随以下几个步骤来使用它
- 创建自定义的实体类并实现
ScheduleEnable
接口
public class MySubject implements ScheduleEnable {
//省略属性、setter、getter、构造函数
@Override
public Schedule getSchedule() {
Schedule schedule=new Schedule();
schedule.setDay(getDay());
schedule.setName(getName());
schedule.setRoom(getRoom());
schedule.setStart(getStart());
schedule.setStep(getStep());
schedule.setTeacher(getTeacher());
schedule.setWeekList(getWeekList());
schedule.setColorRandom(2);
return schedule;
}
}
- 使用
source()
设置
//模拟获取课程数据:自定义格式
List<MySubject> mySubjects = SubjectRepertory.loadDefaultSubjects();
//设置数据源并显示
mTimetableView.source(mySubjects)
.curWeek(1)
.showView();
配置属性
我直接把这部分整个代码放出来了,分以下三步:
- 获取控件
- 设置
WeekView
属性 - 设置
TimetableView
属性
使用如下方式获取到控件
TimetableView mTimetableView;
WeekView mWeekView;
/**
* 初始化课程控件
*/
private void initTimetableView() {
//获取控件
mWeekView = findViewById(R.id.id_weekview);
mTimetableView = findViewById(R.id.id_timetableView);
//设置周次选择属性
mWeekView.source(mySubjects)
.curWeek(1)
.callback(new IWeekView.OnWeekItemClickedListener() {
@Override
public void onWeekClicked(int week) {
int cur = mTimetableView.curWeek();
//更新切换后的日期,从当前周cur->切换的周week
mTimetableView.onDateBuildListener()
.onUpdateDate(cur, week);
//课表切换周次
mTimetableView.changeWeekOnly(week);
}
})
.callback(new IWeekView.OnWeekLeftClickedListener() {
@Override
public void onWeekLeftClicked() {
onWeekLeftLayoutClicked();
}
})
.isShow(false)//设置隐藏,默认显示
.showView();
mTimetableView.source(mySubjects)
.curWeek(1)
.curTerm("大三下学期")
.maxSlideItem(10)
//透明度
//日期栏0.1f、侧边栏0.1f,周次选择栏0.6f
//透明度范围为0->1,0为全透明,1为不透明
.alpha(0.3f, 0.1f, 0.6f)
.callback(new ISchedule.OnItemClickListener() {
@Override
public void onItemClick(View v, List<Schedule> scheduleList) {
display(scheduleList);
}
})
.callback(new ISchedule.OnItemLongClickListener() {
@Override
public void onLongClick(View v, int day, int start) {
Toast.makeText(BaseFuncActivity.this,
"长按:周" + day + ",第" + start + "节",
Toast.LENGTH_SHORT).show();
}
})
.callback(new ISchedule.OnWeekChangedListener() {
@Override
public void onWeekChanged(int curWeek) {
titleTextView.setText("第" + curWeek + "周");
}
})
//旗标布局点击监听
.callback(new ISchedule.OnFlaglayoutClickListener() {
@Override
public void onFlaglayoutClick(int day, int start) {
mTimetableView.hideFlaglayout();
Toast.makeText(BaseFuncActivity.this,
"点击了旗标:周" + (day + 1) + ",第" + start + "节",
Toast.LENGTH_SHORT).show();
}
})
.showView();
}
删除课程
/**
* 删除课程
* 内部使用集合维护课程数据,操作集合的方法来操作它即可
* 最后更新一下视图(全局更新)
*/
protected void deleteSubject() {
int size = mTimetableView.dataSource().size();
int pos = (int) (Math.random() * size);
if (size > 0) {
mTimetableView.dataSource().remove(pos);
mTimetableView.updateView();
}
}
添加课程
/**
* 添加课程
* 内部使用集合维护课程数据,操作集合的方法来操作它即可
* 最后更新一下视图(全局更新)
*/
protected void addSubject() {
List<Schedule> dataSource=mTimetableView.dataSource();
int size = dataSource.size();
if (size > 0) {
Schedule schedule = dataSource.get(0);
dataSource.add(schedule);
mTimetableView.updateView();
}
}
非本周课程显示与隐藏
/**
* 隐藏非本周课程
* 修改了内容的显示,所以必须更新全部(性能不高)
* 建议:在初始化时设置该属性
*
* updateView()被调用后,会重新构建课程,课程会回到当前周
*/
protected void hideNonThisWeek() {
mTimetableView.isShowNotCurWeek(false).updateView();
}
/**
* 显示非本周课程
* 修改了内容的显示,所以必须更新全部(性能不高)
* 建议:在初始化时设置该属性
*/
protected void