Android自定义View实现课程表表格

作者:Chaek 时间:2023-03-11 19:33:08 

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

Android自定义View实现课程表表格

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

Android自定义View实现课程表表格

根据上面的看来觉得总体布局我分了两个 上面的星期是一个 下面的节数和格子是一个  总体使用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<TimeTableModel> 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<TimeTableModel> mListTimeTable = new ArrayList<TimeTableModel>();

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<TimeTableModel> 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<TimeTableModel> 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<TimeTableModel> 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;
}
}

布局文件


<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="@android:color/white"
android:orientation="vertical" >

<ScrollView
android:layout_width="fill_parent"
android:layout_height="fill_parent" >

<com.shallcheek.timetale.TimeTableView
 android:id="@+id/main_timetable_ly"
 android:layout_width="fill_parent"
 android:layout_height="fill_parent"
 android:orientation="vertical" >
</com.shallcheek.timetale.TimeTableView>
</ScrollView>

</LinearLayout>

最新版查看:查看地址

来源:https://blog.csdn.net/shallcheek/article/details/44303197

标签:Android,View,表格
0
投稿

猜你喜欢

  • java实现将结果集封装到List中的方法

    2021-10-27 22:29:45
  • Android开发之DatePickerDialog、TimePickerDialog时间日期对话框用法示例

    2022-10-25 21:21:12
  • Fluent Mybatis实际开发中的优势对比

    2022-07-09 14:29:34
  • Java利用自定义注解、反射实现简单BaseDao实例

    2022-09-06 05:29:30
  • Java数据结构之线性表

    2022-08-21 06:32:28
  • c#实现metro文件压缩解压示例

    2022-07-07 22:36:33
  • Java中Stream流去除List重复元素的方法

    2023-09-04 04:50:33
  • 解决SpringBoot运行Test时报错:SpringBoot Unable to find

    2021-11-15 16:48:56
  • Android网格布局GridView学习使用

    2023-02-07 15:03:13
  • flutter 路由跳转的实现示例

    2023-08-23 14:55:26
  • C#实现文件夹的复制和删除

    2023-02-18 00:54:22
  • SpringBoot+redis配置及测试的方法

    2022-11-21 04:12:52
  • hibernate4基本配置方式详解

    2023-03-11 11:07:43
  • SpringBoot @ConfigurationProperties注解的简单使用

    2021-09-03 12:21:57
  • 详解SpringMVC中的日期处理和文件上传操作

    2021-11-13 05:39:18
  • Java客户端调用.NET的WebService实例

    2023-11-03 17:22:00
  • java 工厂模式的讲解及优缺点的介绍

    2022-02-05 10:57:09
  • C#实现读取匿名对象属性值的方法示例总结

    2023-02-02 18:56:03
  • Spring Cloud 覆写远端的配置属性实例详解

    2022-09-10 22:06:23
  • 举例详解Java中的访问权限修饰符

    2023-01-18 08:52:17
  • asp之家 软件编程 m.aspxhome.com