Android中显示表格是非常痛苦的事情,因为屏幕空间有限,如果你要在android使用表格,那么可以考虑使用TableFixHeaders,TableFixHeaders可以在表格标题一列不动的情况下,左右滑动以显示被挡住的数据。开源网站上有源码
https://github.com/InQBarna/TableFixHeaders。
源码中可以看到设置行高很简单,可以设置每行高度。如下:
@Override
public int getHeight(int row) {
return height;
}
看到上图,表头跟表体一样大行里都有多行,表头有两小行,表体每行有三小行。
就需要重写getHeight(int row)方法,
@Override
public int getHeight(int row) {//假设表总共3行,row为-1,0,1.row=-1为表头
if(row==-1){
return height*6/8; //height初始化为屏幕高度的1/6,表示每大行高度,表头可以高度小点
}
//shiftNum=3 表示三小行,根据需要修改
if(list!=null&&!list.isEmpty()){
WorkArrangeLog workArrangeLog = list.get(row*shiftNum);// list表示数据集合,如6条数据就需要两大行来显示 row 为0,1
WorkArrangeLog workArrangeLog1 = list.get(row*shiftNum+1);
WorkArrangeLog workArrangeLog2 = list.get(row*shiftNum+2);
int c1 = workArrangeLog.getRowCount();//表示每条数据占几个平均行高,根据4个人名一行原则.
int c2 = workArrangeLog1.getRowCount();
int c3 = workArrangeLog2.getRowCount();
map.put(row*shiftNum, c1);//12条数据,每条数据占几个平均行高,放大map里面.
map.put(row*shiftNum+1, c2);
map.put(row*shiftNum+2, c3);
return height*(c1+c2+c3)/3; //返回该大行高度row为0,1,两个大行.
}
return height;
}
从代码可以看出,list.size()=6, 每条数据需要占高度map{0=1,1=1,2=2,3=1,4=1,5=1}表示每行占几个平均高度,第三小行占2个平均高度
看表头代码:
具体数据动态设置,这里为了方便,写死。
String[] titles1 = new String[]{
"周一","周二","周三","周四","周五","周六","周日"
};
String[] titles = new String[]{
"2016-08-15","2016-08-16","2016-08-17",
"2016-08-18","2016-08-19","2016-08-20","2016-08-21"
};
创建表头方法:
/**
* 生成HeaderView
*
*/
private HeaderViewHolder createHeaderView(int column) {
HeaderViewHolder headerViewHolder = new HeaderViewHolder();
if (column > 1) { //从第四列开始,每大行有两小行 列的顺序-1,0,1,2.
View view = inflater.inflate(R.layout.workforce_item_table_header2, null);
TextView title = (TextView) view.findViewById(R.id.title);//日期
title.setTextSize(14);
TextView title1 = (TextView) view.findViewById(R.id.title1);//星期
title1.setTextSize(14);
headerViewHolder.view = view;
headerViewHolder.title = title;
headerViewHolder.title1 = title1;
} else {
View view = inflater.inflate(R.layout.item_table_header1, null);
TextView title = (TextView) view.findViewById(R.id.title);
headerViewHolder.view = view;
headerViewHolder.title = title;
}
return headerViewHolder;
}
由上图和代码可以看出,周一例会班的数据超出了平均高度范围,需要根据内容长度来设置每行高度,这里根据4个人名一行的原则来计算内容占几个平均行高,
如例会班7人,占2个平均行高。
@Override
public View getView(int row, int column, View convertView, ViewGroup parent) {
View view = null;
if (row == -1) {//表头
HeaderViewHolder headerViewHolder = createHeaderView(column);//创建表头
if (headerViewHolder != null) {
headerViewHolder.title.setText(titles[column+1]);
}
//从第四列开始,每大行有两小行 列的顺序-1,0,1,2
if (column>1) {
headerViewHolder.title1.setText(titles1[column-2]);
}
view = headerViewHolder.view;
} else {//表体
if(column>0){
if (row % 2 == 0) {
view = inflater.inflate(R.layout.workforce_item_table_cell3, null);// 布局3 和 4 只是背景不同,如上图
} else {
view = inflater.inflate(R.layout.workforce_item_table_cell4, null);
}
// linearlayout布局采用weight分配 ,下面代码中 height为大行高度 ,map.get(row*shiftNum) 表示权重
//有三小行的话,先height/3 获得平均行的高度,再乘以权重weight。如果三行weight 都为1 ,则每行都是平均高度。
//上图 如例会班7个人,就占两个平均行高度。这样就根据显示内容得到weight值为2,例会班是text3表示,text3高度为
// height(map.get(row*shiftNum))/3
TextView textView1 = (TextView) view.findViewById(R.id.text);//第一小行
textView1.setLayoutParams(new LinearLayout.LayoutParams(//设置控件高度
LayoutParams.FILL_PARENT, height*(map.get(row*shiftNum))/3, (float)(map.get(row*shiftNum))))
TextView textView2 = (TextView) view.findViewById(R.id.text1);;//第二小行
textView2.setLayoutParams(new LinearLayout.LayoutParams(
LayoutParams.FILL_PARENT, height*(map.get(row*shiftNum+1))/3, (float)(map.get(row*shiftNum+1))));
TextView textView3 = (TextView) view.findViewById(R.id.text2);;//第三小行隐藏了,根据自己需要设置多少行
textView3.setLayoutParams(new LinearLayout.LayoutParams(
LayoutParams.FILL_PARENT, height*(map.get(row*shiftNum+2))/3, (float)(map.get(row*shiftNum+2))));
View view1 = view.findViewById(R.id.view);//text3底部线
textView1.setText(getText(row, column, 0)); //getText(row, column, index)方法是设置数据的,自行定义
textView2.setText(getText(row, column, 1));
if(shiftNum==3){
textView3.setText(getText(row, column, 2));//隐藏第三小行
}else{
textView3.setVisibility(View.GONE);
view1.setVisibility(View.GONE);
}
}else{
if (row % 2 == 0) {
view = inflater.inflate(R.layout.workforce_item_table_cell1, null);
} else {
view = inflater.inflate(R.layout.workforce_item_table_cell2, null);
}
TextView textView = (TextView) view.findViewById(R.id.text);
textView.setText(getText(row, column, 1));
}
}
return view;
}
获取数据方法自行设置:
private CharSequence getText(int row, int column, int index) {
WorkArrangeLog workArrangeLog = list.get(row*shiftNum);
WorkArrangeLog workArrangeLog1 = list.get(row*shiftNum+1);
WorkArrangeLog workArrangeLog2 = list.get(row*shiftNum+2);
List<Observer> observers = null;
if (column == -1) {
return String.valueOf(row+1);//编号
}else if(column == 0){
if(index == 0){
}else if(index == 1){
return workArrangeLog1.getGridName();//网格名称
}else{
}
}else if(column == 1){
if(index == 0){
return workArrangeLog.getShiftName();//班次名称
}else if(index == 1){
return workArrangeLog1.getShiftName();
}else{
return workArrangeLog2.getShiftName();
}
}else if(column == 2){
if(index == 0){
observers = workArrangeLog.getMon_observer();
return getNames(observers);
}else if(index == 1){
observers = workArrangeLog1.getMon_observer();
return getNames(observers);
}else{
observers = workArrangeLog2.getMon_observer();
return getNames(observers);
}
}else if(column == 3){
if(index == 0){
observers = workArrangeLog.getTues_observer();
return getNames(observers);
}else if(index == 1){
observers = workArrangeLog1.getTues_observer();
return getNames(observers);
}else{
observers = workArrangeLog2.getTues_observer();
return getNames(observers);
}
}else if(column == 4){
if(index == 0){
observers = workArrangeLog.getWed_observer();
return getNames(observers);
}else if(index == 1){
observers = workArrangeLog1.getWed_observer();
return getNames(observers);
}else{
observers = workArrangeLog2.getWed_observer();
return getNames(observers);
}
}else if(column == 5){
if(index == 0){
observers = workArrangeLog.getThur_observer();
return getNames(observers);
}else if(index == 1){
observers = workArrangeLog1.getThur_observer();
return getNames(observers);
}else{
observers = workArrangeLog2.getThur_observer();
return getNames(observers);
}
}else if(column == 6){
if(index == 0){
observers = workArrangeLog.getFri_observer();
return getNames(observers);
}else if(index == 1){
observers = workArrangeLog1.getFri_observer();
return getNames(observers);
}else{
observers = workArrangeLog2.getFri_observer();
return getNames(observers);
}
}else if(column == 7){
if(index == 0){
observers = workArrangeLog.getSat_observer();
return getNames(observers);
}else if(index == 1){
observers = workArrangeLog1.getSat_observer();
return getNames(observers);
}else{
observers = workArrangeLog2.getSat_observer();
return getNames(observers);
}
}else if(column == 8){
if(index == 0){
observers = workArrangeLog.getSun_observer();
return getNames(observers);
}else if(index == 1){
observers = workArrangeLog1.getSun_observer();
return getNames(observers);
}else{
observers = workArrangeLog2.getSun_observer();
return getNames(observers);
}
}
return null;
}