TableFixHeaders动态设置行高



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


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值