自己闲下来时间写的一个课表控件使用的自定义LinearLayout 里面View都是用代码实现的 最终效果如下图 写的可能有问题希望多多指点

创建一个自定义LinearLayout 控件用来装载课程的信息和课程的周数 和节数大概的布局三这样的

根据上面的看来觉得总体布局我分了两个 上面的星期是一个 下面的节数和格子是一个  总体使用Vertical  而单独内部者使用了Horizontal布局  中间使用了两种布局线条 是这样的

/**

* 横的分界线

*

* @return

*/

private View getWeekTransverseLine() {

TextView mWeekline = new TextView(getContext());

mWeekline.setBackgroundColor(getResources().getColor(R.color.view_line));

mWeekline.setHeight(TimeTableLineHeight);

mWeekline.setWidth(LayoutParams.FILL_PARENT);

return mWeekline;

}

/**

* 竖向分界线

*

* @return

*/

private View getWeekVerticalLine() {

TextView mWeekline = new TextView(getContext());

mWeekline.setBackgroundColor(getResources().getColor(R.color.view_line));

mWeekline.setHeight(dip2px(TimeTableWeekNameHeight));

mWeekline.setWidth((TimeTableLineHeight));

return mWeekline;

}

下面就看其它的View

那就从上到下开始先看星期的布局

private void initView() {

mHorizontalWeekLayout = new LinearLayout(getContext());

mHorizontalWeekLayout.setOrientation(HORIZONTAL);

mVerticalWeekLaout = new LinearLayout(getContext());

mVerticalWeekLaout.setOrientation(HORIZONTAL);

//表格

for (int i = 0; i <= WEEKNUM; i++) {

switch (i) {

case 0:

//课表出的0,0格子 空白的

TextView mTime = new TextView(getContext());

mTime.setHeight(dip2px(TimeTableWeekNameHeight));

mTime.setWidth((dip2px(TimeTableNumWidth)));

mHorizontalWeekLayout.addView(mTime);

//绘制1~MAXNUM

LinearLayout mMonday = new LinearLayout(getContext());

ViewGroup.LayoutParams mm = new ViewGroup.LayoutParams(dip2px(TimeTableNumWidth), dip2px(MAXNUM * TimeTableHeight) + MAXNUM * 2);

mMonday.setLayoutParams(mm);

mMonday.setOrientation(VERTICAL);

for (int j = 1; j <= MAXNUM; j++) {

TextView mNum = new TextView(getContext());

mNum.setGravity(Gravity.CENTER);

mNum.setTextColor(getResources().getColor(R.color.text_color));

mNum.setHeight(dip2px(TimeTableHeight));

mNum.setWidth(dip2px(TimeTableNumWidth));

mNum.setTextSize(14);

mNum.setText(j + "");

mMonday.addView(mNum);

mMonday.addView(getWeekTransverseLine());

}

mVerticalWeekLaout.addView(mMonday);

break;

case 1:

case 2:

case 3:

case 4:

case 5:

case 6:

case 7:

// 设置显示星期一 到星期天

LinearLayout mHoriView = new LinearLayout(getContext());

mHoriView.setOrientation(VERTICAL);

TextView mWeekName = new TextView(getContext());

mWeekName.setTextColor(getResources().getColor(R.color.text_color));

mWeekName.setWidth(((getViewWidth() - dip2px(TimeTableNumWidth))) / WEEKNUM);

mWeekName.setHeight(dip2px(TimeTableWeekNameHeight));

mWeekName.setGravity(Gravity.CENTER);

mWeekName.setTextSize(16);

mWeekName.setText(weekname[i - 1]);

mHoriView.addView(mWeekName);

mHorizontalWeekLayout.addView(mHoriView);

List mListMon = new ArrayList<>();

//遍历出星期1~7的课表

for (TimeTableModel timeTableModel : mListTimeTable) {

if (timeTableModel.getWeek() == i) {

mListMon.add(timeTableModel);

}

}

//添加

LinearLayout mLayout = getTimeTableView(mListMon, i);

mLayout.setOrientation(VERTICAL);

ViewGroup.LayoutParams linearParams = new ViewGroup.LayoutParams((getViewWidth() - dip2px(20)) / WEEKNUM, LayoutParams.FILL_PARENT);

mLayout.setLayoutParams(linearParams);

mLayout.setWeightSum(1);

mVerticalWeekLaout.addView(mLayout);

break;

default:

break;

}

TextView l = new TextView(getContext());

l.setHeight(dip2px(TimeTableHeight * MAXNUM) + MAXNUM * 2);

l.setWidth(2);

l.setBackgroundColor(getResources().getColor(R.color.view_line));

mVerticalWeekLaout.addView(l);

mHorizontalWeekLayout.addView(getWeekVerticalLine());

}

addView(mHorizontalWeekLayout);

addView(getWeekTransverseLine());

addView(mVerticalWeekLaout);

addView(getWeekTransverseLine());

}

TimeTableModel

package com.shallcheek.timetale;

public class TimeTableModel {

private int id;

private int startnum;

private int endnum;

private int week;

private String starttime="";

private String endtime="";

private String name="";

private String teacher="";

private String classroom="";

private String weeknum="";

@Override

public String toString() {

return "TimeTableModel [id=" + id + ", startnum=" + startnum

+ ", endnum=" + endnum + ", week=" + week + ", starttime="

+ starttime + ", endtime=" + endtime + ", name=" + name

+ ", teacher=" + teacher + ", classroom=" + classroom

+ ", weeknum=" + weeknum + "]";

}

public int getId() {

return id;

}

public int getStartnum() {

return startnum;

}

public int getEndnum() {

return endnum;

}

public int getWeek() {

return week;

}

public String getStarttime() {

return starttime;

}

public String getEndtime() {

return endtime;

}

public String getName() {

return name;

}

public String getTeacher() {

return teacher;

}

public String getClassroom() {

return classroom;

}

public String getWeeknum() {

return weeknum;

}

public void setId(int id) {

this.id = id;

}

public void setStartnum(int startnum) {

this.startnum = startnum;

}

public void setEndnum(int endnum) {

this.endnum = endnum;

}

public void setWeek(int week) {

this.week = week;

}

public void setStarttime(String starttime) {

this.starttime = starttime;

}

public void setEndtime(String endtime) {

this.endtime = endtime;

}

public void setName(String name) {

this.name = name;

}

public void setTeacher(String teacher) {

this.teacher = teacher;

}

public void setClassroom(String classroom) {

this.classroom = classroom;

}

public void setWeeknum(String weeknum) {

this.weeknum = weeknum;

}

public TimeTableModel() {

// TODO Auto-generated constructor stub

}

public TimeTableModel(int id, int startnum, int endnum, int week,

String starttime, String endtime, String name, String teacher,

String classroom, String weeknum) {

super();

this.id = id;

this.startnum = startnum;

this.endnum = endnum;

this.week = week;

this.starttime = starttime;

this.endtime = endtime;

this.name = name;

this.teacher = teacher;

this.classroom = classroom;

this.weeknum = weeknum;

}

}

TimeTableView

package com.shallcheek.timetale;

import java.util.ArrayList;

import java.util.List;

import android.content.Context;

import android.graphics.Canvas;

import android.util.AttributeSet;

import android.util.Log;

import android.view.Gravity;

import android.view.View;

import android.view.ViewGroup;

import android.view.WindowManager;

import android.widget.LinearLayout;

import android.widget.TextView;

import android.widget.Toast;

/**

* 课表显示View

*

* @author shallcheek

*/

public class TimeTableView extends LinearLayout {

/**

* 配色数组

*/

public static int colors[] = {R.drawable.select_label_san,

R.drawable.select_label_er, R.drawable.select_label_si,

R.drawable.select_label_wu, R.drawable.select_label_liu,

R.drawable.select_label_qi, R.drawable.select_label_ba,

R.drawable.select_label_jiu, R.drawable.select_label_sss,

R.drawable.select_label_se, R.drawable.select_label_yiw,

R.drawable.select_label_sy, R.drawable.select_label_yiwu,

R.drawable.select_label_yi, R.drawable.select_label_wuw};

private final static int START = 0;

//最大节数

public final static int MAXNUM = 12;

//显示到星期几

public final static int WEEKNUM = 7;

//单个View高度

private final static int TimeTableHeight = 50;

//线的高度

private final static int TimeTableLineHeight = 2;

private final static int TimeTableNumWidth = 20;

private final static int TimeTableWeekNameHeight = 30;

private LinearLayout mHorizontalWeekLayout;//第一行的星期显示

private LinearLayout mVerticalWeekLaout;//课程格子

private String[] weekname = {"一", "二", "三", "四", "五", "六", "七"};

public static String[] colorStr = new String[20];

int colornum = 0;

//数据源

private List mListTimeTable = new ArrayList();

public TimeTableView(Context context) {

super(context);

}

public TimeTableView(Context context, AttributeSet attributeSet) {

super(context, attributeSet);

}

@Override

protected void onDraw(Canvas canvas) {

super.onDraw(canvas);

}

/**

* 横的分界线

*

* @return

*/

private View getWeekTransverseLine() {

TextView mWeekline = new TextView(getContext());

mWeekline.setBackgroundColor(getResources().getColor(R.color.view_line));

mWeekline.setHeight(TimeTableLineHeight);

mWeekline.setWidth(LayoutParams.FILL_PARENT);

return mWeekline;

}

/**

* 竖向分界线

*

* @return

*/

private View getWeekVerticalLine() {

TextView mWeekline = new TextView(getContext());

mWeekline.setBackgroundColor(getResources().getColor(R.color.view_line));

mWeekline.setHeight(dip2px(TimeTableWeekNameHeight));

mWeekline.setWidth((TimeTableLineHeight));

return mWeekline;

}

private void initView() {

mHorizontalWeekLayout = new LinearLayout(getContext());

mHorizontalWeekLayout.setOrientation(HORIZONTAL);

mVerticalWeekLaout = new LinearLayout(getContext());

mVerticalWeekLaout.setOrientation(HORIZONTAL);

//表格

for (int i = 0; i <= WEEKNUM; i++) {

switch (i) {

case 0:

//课表出的0,0格子 空白的

TextView mTime = new TextView(getContext());

mTime.setHeight(dip2px(TimeTableWeekNameHeight));

mTime.setWidth((dip2px(TimeTableNumWidth)));

mHorizontalWeekLayout.addView(mTime);

//绘制1~MAXNUM

LinearLayout mMonday = new LinearLayout(getContext());

ViewGroup.LayoutParams mm = new ViewGroup.LayoutParams(dip2px(TimeTableNumWidth), dip2px(MAXNUM * TimeTableHeight) + MAXNUM * 2);

mMonday.setLayoutParams(mm);

mMonday.setOrientation(VERTICAL);

for (int j = 1; j <= MAXNUM; j++) {

TextView mNum = new TextView(getContext());

mNum.setGravity(Gravity.CENTER);

mNum.setTextColor(getResources().getColor(R.color.text_color));

mNum.setHeight(dip2px(TimeTableHeight));

mNum.setWidth(dip2px(TimeTableNumWidth));

mNum.setTextSize(14);

mNum.setText(j + "");

mMonday.addView(mNum);

mMonday.addView(getWeekTransverseLine());

}

mVerticalWeekLaout.addView(mMonday);

break;

case 1:

case 2:

case 3:

case 4:

case 5:

case 6:

case 7:

// 设置显示星期一 到星期天

LinearLayout mHoriView = new LinearLayout(getContext());

mHoriView.setOrientation(VERTICAL);

TextView mWeekName = new TextView(getContext());

mWeekName.setTextColor(getResources().getColor(R.color.text_color));

mWeekName.setWidth(((getViewWidth() - dip2px(TimeTableNumWidth))) / WEEKNUM);

mWeekName.setHeight(dip2px(TimeTableWeekNameHeight));

mWeekName.setGravity(Gravity.CENTER);

mWeekName.setTextSize(16);

mWeekName.setText(weekname[i - 1]);

mHoriView.addView(mWeekName);

mHorizontalWeekLayout.addView(mHoriView);

List mListMon = new ArrayList<>();

//遍历出星期1~7的课表

for (TimeTableModel timeTableModel : mListTimeTable) {

if (timeTableModel.getWeek() == i) {

mListMon.add(timeTableModel);

}

}

//添加

LinearLayout mLayout = getTimeTableView(mListMon, i);

mLayout.setOrientation(VERTICAL);

ViewGroup.LayoutParams linearParams = new ViewGroup.LayoutParams((getViewWidth() - dip2px(20)) / WEEKNUM, LayoutParams.FILL_PARENT);

mLayout.setLayoutParams(linearParams);

mLayout.setWeightSum(1);

mVerticalWeekLaout.addView(mLayout);

break;

default:

break;

}

TextView l = new TextView(getContext());

l.setHeight(dip2px(TimeTableHeight * MAXNUM) + MAXNUM * 2);

l.setWidth(2);

l.setBackgroundColor(getResources().getColor(R.color.view_line));

mVerticalWeekLaout.addView(l);

mHorizontalWeekLayout.addView(getWeekVerticalLine());

}

addView(mHorizontalWeekLayout);

addView(getWeekTransverseLine());

addView(mVerticalWeekLaout);

addView(getWeekTransverseLine());

}

private int getViewWidth() {

WindowManager wm = (WindowManager) getContext().getSystemService(

Context.WINDOW_SERVICE);

return wm.getDefaultDisplay().getWidth();

}

private View addStartView(int startnum, final int week, final int start) {

LinearLayout mStartView = new LinearLayout(getContext());

mStartView.setOrientation(VERTICAL);

for (int i = 1; i < startnum; i++) {

TextView mTime = new TextView(getContext());

mTime.setGravity(Gravity.CENTER);

mTime.setHeight(dip2px(TimeTableHeight));

mTime.setWidth(dip2px(TimeTableHeight));

mStartView.addView(mTime);

mStartView.addView(getWeekTransverseLine());

final int num = i;

//这里可以处理空白处点击添加课表

mTime.setOnClickListener(new OnClickListener() {

@Override

public void onClick(View v) {

Toast.makeText(getContext(), "星期" + week + "第" + (start + num) + "节", Toast.LENGTH_LONG).show();

}

});

}

return mStartView;

}

/**

* 星期一到星期天的课表

*

* @param model

* @param week

* @return

*/

private LinearLayout getTimeTableView(List model, int week) {

LinearLayout mTimeTableView = new LinearLayout(getContext());

mTimeTableView.setOrientation(VERTICAL);

int modesize = model.size();

if (modesize <= 0) {

mTimeTableView.addView(addStartView(MAXNUM + 1, week, 0));

} else {

for (int i = 0; i < modesize; i++) {

if (i == 0) {

//添加的0到开始节数的空格

mTimeTableView.addView(addStartView(model.get(0).getStartnum(), week, 0));

mTimeTableView.addView(getMode(model.get(0)));

} else if (model.get(i).getStartnum() - model.get(i - 1).getStartnum() > 0) {

//填充

mTimeTableView.addView(addStartView(model.get(i).getStartnum() - model.get(i - 1).getEndnum(), week, model.get(i - 1).getEndnum()));

mTimeTableView.addView(getMode(model.get(i)));

}

if (i + 1 == modesize) {

mTimeTableView.addView(addStartView(MAXNUM - model.get(i).getEndnum(), week, model.get(i).getEndnum()));

}

}

}

return mTimeTableView;

}

/**

* 获取单个课表View 也可以自定义我这个

*

* @param model 数据类型

* @return

*/

@SuppressWarnings("deprecation")

private View getMode(final TimeTableModel model) {

LinearLayout mTimeTableView = new LinearLayout(getContext());

mTimeTableView.setOrientation(VERTICAL);

TextView mTimeTableNameView = new TextView(getContext());

int num = model.getEndnum() - model.getStartnum();

mTimeTableNameView.setHeight(dip2px((num + 1) * TimeTableHeight) + num * 2);

mTimeTableNameView.setTextColor(getContext().getResources().getColor(

android.R.color.white));

mTimeTableNameView.setWidth(dip2px(50));

mTimeTableNameView.setTextSize(16);

mTimeTableNameView.setGravity(Gravity.CENTER);

mTimeTableNameView.setText(model.getName() + "@" + model.getClassroom());

mTimeTableView.addView(mTimeTableNameView);

mTimeTableView.addView(getWeekTransverseLine());

mTimeTableView.setBackgroundDrawable(getContext().getResources()

.getDrawable(colors[getColorNum(model.getName())]));

mTimeTableView.setOnClickListener(new OnClickListener() {

@Override

public void onClick(View v) {

Toast.makeText(getContext(), model.getName() + "@" + model.getClassroom(), Toast.LENGTH_LONG).show();

}

});

return mTimeTableView;

}

/**

* 转换dp

*

* @param dpValue

* @return

*/

public int dip2px(float dpValue) {

float scale = getContext().getResources().getDisplayMetrics().density;

return (int) (dpValue * scale + 0.5f);

}

public void setTimeTable(List mlist) {

this.mListTimeTable = mlist;

for (TimeTableModel timeTableModel : mlist) {

addTimeName(timeTableModel.getName());

}

initView();

invalidate();

}

/**

* 输入课表名循环判断是否数组存在该课表 如果存在输出true并退出循环 如果不存在则存入colorSt[20]数组

*

* @param name

*/

private void addTimeName(String name) {

boolean isRepeat = true;

for (int i = 0; i < 20; i++) {

if (name.equals(colorStr[i])) {

isRepeat = true;

break;

} else {

isRepeat = false;

}

}

if (!isRepeat) {

colorStr[colornum] = name;

colornum++;

}

}

/**

* 获取数组中的课程名

*

* @param name

* @return

*/

public static int getColorNum(String name) {

int num = 0;

for (int i = 0; i < 20; i++) {

if (name.equals(colorStr[i])) {

num = i;

}

}

return num;

}

}

布局文件

android:layout_width="fill_parent"

android:layout_height="fill_parent"

android:background="@android:color/white"

android:orientation="vertical" >

android:layout_width="fill_parent"

android:layout_height="fill_parent" >

android:id="@+id/main_timetable_ly"

android:layout_width="fill_parent"

android:layout_height="fill_parent"

android:orientation="vertical" >

转载请注明出处:http://blog..net/shallcheek/article/details/44303197

源码下载地址 : http://download..net/detail/shallcheek/8505477 这个代码可能过时了

最新版查看: https://github.com/shallcheek/TimeTable/

Android自定义View课程表,Android 自定义View课程表表格相关推荐

  1. android小球移动代码,Android自定义圆形View实现小球跟随手指移动效果

    本文实例为大家分享了Android实现小球跟随手指移动效果的具体代码,供大家参考,具体内容如下 一. 需求功能 手指在屏幕上滑动,红色的小球始终跟随手指移动. 实现的思路: 1)自定义View,在on ...

  2. android 画布实现签名,Android 自定义View手写签名并保存图片

    1.自定义View--支撑设置画笔色彩,画笔宽度,画板色彩,铲除画板,查看是否有签名,保存画板图片(仿制粘贴可直接使用) /***CreatedbyYyyyQon2020/3/5. *电子签名*/pu ...

  3. android canvas绘制圆角_Android自定义View撸一个渐变的温度指示器(TmepView)

    秦子帅明确目标,每天进步一点点..... 作者 |  andy 地址 |  blog.csdn.net/Andy_l1/article/details/82910061 1.概述 自定义View对需要 ...

  4. android绘制心形_Android自定义View系列(一)——打造一个爱心进度条

    写作原因:Android进阶过程中有一个绕不开的话题--自定义View.这一块是安卓程序员更好地实现功能自主化必须迈出的一步.下面这个系列博主将通过实现几个例子来认识安卓自定义View的方法.从自定义 ...

  5. 我的Android进阶之旅------Android自定义View来实现解析lrc歌词并同步滚动、上下拖动、缩放歌词的功能...

    前言 一LRC歌词文件简介 1什么是LRC歌词文件 2LRC歌词文件的格式 LRC歌词文件的标签类型 1标识标签 2时间标签 二解析LRC歌词 1读取出歌词文件 2解析得到的歌词内容 1表示每行歌词内 ...

  6. Android中实现Bitmap在自定义View中的放大与拖动

    一基本实现思路: 基于View类实现自定义View –MyImageView类.在使用View的Activity类中完成OnTouchListener接口,实现对MotionEvent事件的监听与处理 ...

  7. Android之在Layout中自定义View

    在Layout中自定义View 经常会看到在XML文件中调用别人的View就可以显示出各种奇妙的页面 简单的学习了一下,下面说一下如何自定义一个View, 并设置背景色 // 第一步,创建一个继承自V ...

  8. android 单选框 icon,Android中的普通对话框、单选对话框、多选对话框、带Icon的对话框、以及自定义Adapter和自定义View对话框详解...

    标签: 对话框就是一个AlertDialog,但是一个简单的AlertDialog,我们却可以将它玩出许多花样来,下面我们就来一起总结一下AlertDialog的用法.看看各位童鞋在平时的工作中否都用 ...

  9. android自定义控件中文乱码,Android笔记--自定义View之组合控件

    Android-自定义View 分享是最好的记忆-- 如需转发请注明出处 [强调]:共同学习 共同进步 不喜勿喷 内容简介 前言 实现 总结 1. 前言 这次更新有2个目的 1. 复用控件,而不是每次 ...

最新文章

  1. python实现均值滤波_python如何实现均值滤波?
  2. C 语言编程 — 编程实践
  3. seo网站优化如何写好文章
  4. 如何使用Spring优雅地处理REST异常?
  5. Linux之Nginx
  6. Python的from import和import的区别?
  7. [转]如何将属性表嵌入对话框中显示
  8. HDU 4635 Strongly connected
  9. unity已存在,您无法加载相同的版本
  10. #VSTS日志# Xamarin构建支持和一大波更新
  11. html5游戏作弊码,HTML5新手必备的入门指南秘籍
  12. 重标极差法(R/S)在matlab上的实现
  13. 阶段小练—篮球比赛计分器
  14. 微信小程序云开发-微信小程序账号申请及新手环境配置
  15. [渝粤教育] 无锡商业职业技术学院 导游业务 参考 资料
  16. python open unicodedecodeerror_python 读取文件时报错UnicodeDecodeError: 'gbk' co
  17. redux及react-redux
  18. springboot中使用aliyun的oss
  19. Backup Exec Inventory 与Catalog的含义(转载)
  20. 企业信息化系统如何开发?如何沉淀企业数据?

热门文章

  1. 推荐系统-基于领域的协同过滤算法选择(一文足矣)
  2. Layui下拉框的绑定
  3. 词向量与词向量拼接_动态词向量算法—ELMo
  4. Temux安装Kali NetHunter
  5. 基于SaaS软件即服务模式的报表系统
  6. fiddler +逍遥模拟器 ,添加代理后抓包 app数据
  7. Vue通过微信定位+百度地图获取详细地理位置信息
  8. onmouseout方法
  9. MySQL查询建表语句ddl_oracle之 获取建表ddl语句
  10. 20个 Chat GPT相关的网站