1. 程式人生 > >TableFixHeaders動態設定行高

TableFixHeaders動態設定行高


             Android中顯示錶格是非常痛苦的事情,因為螢幕空間有限,如果你要在android使用表格,那麼可以考慮使用TableFixHeaders,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;
	}


相關推薦

TableFixHeaders動態設定

             Android中顯示錶格是非常痛苦的事情,因為螢幕空間有限,如果你要在android使用表格,那麼可以考慮使用TableFixHeaders,TableFixHeaders可以在表格標題一列不動的情況下,左右滑動以顯示被擋住的資料。開源網站上有原始

excel 匯出 顯示圖片 設定

效果圖: 不多說,直接上程式碼: if ($_REQUEST['act'] == 'export') { ini_set('memory_limit','500M'); set_time_limit(0); $sql = "SE

iOS中最簡單實用的自定義動態返回的cell,動態計算cell的高度

      iOS專案開發中,需要動態返回行高自定義cell的場景可以說是數不過來,可以不誇張的說,只要伺服器返回的同一個欄位的文字字數無限制,那麼我們客戶端在設定的時候就要動態返回行高。      場景:1.當需要tableview展示資料時,一般頭像,暱稱,等資訊都

Android GridView設定,即item高度

其實很簡單,設定GridView中的item佈局中的跟節點中的padding屬性即可。 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.a

TextView 設定並垂直居中

需求: TextView 多行文字可以設定行高(如20dp),每行文字垂直居中。 效果如下: 實現思路:通過設定 TextView 的 lineSpacingExtra 和 lineSpacingMultiplier 來實現。 lineSpacing

uilabel 的相關處理 類富文字(自動換設定,同一個label多種顏色,給文字加下劃線 首縮排 等 等)

1.自動換行 UIFont *font=[UIFont systemFontOfSize:lableFont]; self.numberOfLines=0; self.lineBreakMode=NSLineBreakByWordWrapping; self.text=co

【css】不設定,文字水平垂直居中顯示

利用display:table-cell; 表格<body> <div class="box">爆款推薦</div> <br/>

VBA:設定區域顯示或者隱藏,顯示的單元格自動設定

Private Sub Worksheet_Activate() Dim A As Range, RN As Range, RNS As Range, i As Integer For Each A I

css動態設定

開發十年,就只剩下這套架構體系了! >>>   

QuickReport根據每的內容長度動態調整DetailBand1的

custom ado ger repeat oar right bsp end tom procedure TPosPubFactureRep.DetailBand1BeforePrint(Sender: TQRCustomBand; var PrintBand:

tableView計算動態的總結

rect mar view rac 寫到 ora attr ont pen 研究tableView怎麽計算動態行高研究了兩天一直還不太會,今天最終做出來了想要的效果。 首先。我在網上搜集了非常多資料,各種大神的總結,然後開始看、研究、試驗,基本思路都是一樣

如何動態設定ImageView的寬以及位置

方法1: package com.pic;     import android.app.Activity;   import android.os.Bundle;   import android.util.Log;  

使用canvas畫線,在Js中動態設定和寬

1.定義div   <div style="height:240px;" >                            &

poi excel 設定邊框字型

     final HSSFSheet sheet = wb.createSheet(sheetName + "_" + n);         System.out.println("sheetName" + sheetName

內元素如何設定

參考 HTML 行內元素 與塊級元素 說說行內元素與塊級元素以及之間的轉換? 行內元素在設定浮動後可以設定高寬 1.常用的行內元素 <a> 標籤可定義錨 <abbr> 表示一個縮寫形式 <acronym>定

EAS BOS 設定KDTable列寬改變時自適應內容

private KDTResizeListener resizeListener; @Override public void loadFields() { removeListeners(); super.loadFields(); addListeners(); }

使用畫素單位設定 EXCEL 列寬或

在匯出 Excel 的時候, 經常要需要給列設定寬度或給行設定高度, 在使用 NPOI 或 EppPlus 等元件進行操作的時候, 列寬和行高的單位都不是畫素, 好像是英寸,具體是啥也說不清。 平常在使用單位時, 已經習慣使用畫

設定QTextEdit的間距

設定QTextEdit的行高 QTextCursor textCursor = ui->textEdit->textCursor(); QTextBlockFormat textBlockFormat; textBlockFormat.setLineHeight(40,

彈性盒子的設定文字垂直居中

彈性盒子的行高設定文字垂直居中 行高設定居中對齊,是針對內容寬度 在CSS3的border-sizing模式下,是內減模式 所以要減去padding和border 要小心 <!DOCTYPE html> <html lang="

Android動態設定佈局寬

例如設定一個圖片寬高 關鍵程式碼: //取控制元件當前的佈局引數 LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) imageView.getLayoutParams(); //設定寬度值 params.wi