课表控件
项目地址 https://github.com/zfman/TimetableView
> 本文中的功能介绍、控件用法均针对v2.0.2
-v2.0.6
,你可以在 ChangeLog 查看本控件的开发进展,作者联系方式1193600556@qq.com
TimetableView是一款开源的、完善、高效的Android课程表控件。高效在哪?周次切换高效、样式文件极少(只需1个,v1.x
需要36个只能实现12种样式)
目录
强烈建议升级到v2.0.5
以及以上版本,最新版v2.0.6
最新动态
准备数据源
在开始使用控件之前,你需要准备好数据源,数据可以从网上获取或者使用本地数据,为了方便演示,使用本地的JSON字符串,然后再将其解析为需要的格式
参见 MySubject、SubjectExtras、SubjectRepertory
基础功能
本节你将掌握如何使用本控件搭建自己的课表界面。
虽说本节名字为基础功能
,但是这是一个综合的例子,如果有些地方看不明白或者属性记不住,那么这是正常的,看到下文对应的章节时会清晰很多,如果仍然不懂请联系我~
完整代码参见 BaseFuncActivity
添加依赖
Gradle
compile 'com.zhuangfei:TimetableView:2.0.6'
Maven
<dependency>
<groupId>com.zhuangfei</groupId>
<artifactId>TimetableView</artifactId>
<version>2.0.6</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="@color/app_white">
</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)
.monthWidthDp(30)
//透明度
//日期栏0.1f、侧边栏0.1f,周次选择栏0.6f
//透明度范围为0->1,0为全透明,1为不透明
// .alpha(0.1f, 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 showNonThisWeek() {
mTimetableView.isShowNotCurWeek(true).updateView();
}
最大节次设置
/**
* 设置侧边栏最大节次,只影响侧边栏的绘制,对课程内容无影响
* @param num
*/
protected void setMaxItem(int num) {
mTimetableView.maxSlideItem(num).updateSlideView();
}
节次时间显示与隐藏
/**
* 显示时间
* 设置侧边栏构建监听,TimeSlideAdapter是控件实现的可显示时间的侧边栏
*/
protected void showTime() {
String[] times = new String[]{
"8:00", "9:00", "10:10", "11:00",
"15:00", "16:00", "17:00", "18:00",
"19:30", "20:30","21:30","22:30"
};
OnSlideBuildAdapter listener= (OnSlideBuildAdapter) mTimetableView.onSlideBuildListener();
listener.setTimes(times)
.setTimeTextColor(Color.BLACK);
mTimetableView.updateSlideView();
}
/**
* 隐藏时间
* 将侧边栏监听置Null后,会默认使用默认的构建方法,即不显示时间
* 只修改了侧边栏的属性,所以只更新侧边栏即可(性能高),没有必要更新全部(性能低)
*/
protected void hideTime() {
mTimetableView.callback((ISchedule.OnSlideBuildListener) null);
mTimetableView.updateSlideView();
}
WeekView显示与隐藏
/**
* 显示WeekView
*/
protected void showWeekView(){
mWeekView.isShow(true);
}
/**
* 隐藏WeekView
*/
protected void hideWeekView(){
mWeekView.isShow(false);
}
月份宽度设置
/**
* 设置月份宽度
*/
private void setMonthWidth() {
mTimetableView.monthWidthDp(50).updateView();
}
/**
* 设置月份宽度,默认40dp
*/
private void resetMonthWidth() {
mTimetableView.monthWidthDp(40).updateView();
}
周末显示与隐藏
/**
* 隐藏周末
*/
private void hideWeekends() {
mTimetableView.isShowWeekends(false).updateView();
}
/**
* 显示周末
*/
private void showWeekends() {
mTimetableView.