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