首页 > 系统 > Android > 正文

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

2019-12-12 00:15:54
字体:
来源:转载
供稿:网友

自己闲下来时间写的一个课表控件,使用的自定义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<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>

最新版查看:查看地址

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持武林网。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表