前言
之前寫了兩篇關於Android表格的文章,受到很多同學的喜歡。github地址一些同學提出了新的需求。由於個人精力有限,只能增加個人比較實用的部分功能。下面介紹兩個新功能。

附上之前兩篇文章的地址
陣列或者List轉列
這個功能標題有點坑,舉個例子:

舉個我們熟悉的課程表例子,一個學生
student
,每個星期7天,每一天有上午,下午,晚上dayTime
3個時段,每個時間段有具體的課Lesson
。這個課程學生是否喜歡isFav
,課程下面有課程的知識點LessonPoint
,我們想用表格展示一個班級裡面所有學生的課程表。
當然真實的需求可能沒有這麼多層級,哈哈,產品不可能這麼變態這裡。只是為了驗證多層級是否可以正確展示。效果如下:

註解模式
學生類
@SmartTable(name = "課程表")
public class CollegeStudent {
@SmartColumn(id = 1,name ="姓名")
private String name;
@SmartColumn(type = ColumnType.ArrayChild)
private List<Week> weeks;
}
複製程式碼
星期
public class Week {
@SmartColumn(id=2,name ="星期")
private String name;
@SmartColumn(type = ColumnType.ArrayChild)
private List<Time> times;
}
...
複製程式碼
時間
public class DayTime {
@SmartColumn(id=3,name ="時間")
private String time;
@SmartColumn(type = ColumnType.ArrayChild)
private List<Lesson> lessons;
複製程式碼
後面都是依次類推,
@SmartColumn
註解有個型別type
,ColumnType.ArrayChild
代表要深入到內部裡面每個物件去獲取註解和解析。
你會發現假設是
List<String>
或者int[]
沒辦法繼續深入查詢,那設定ColumnType.ArrayOwn.
它也會解析每個物件,但是不會繼續去查詢物件本身是否有註解。
轉列不只支援
List
還支援陣列。
普通模式
Column<String> studentNameColumn = new Column<>("姓名","name");
ArrayColumn<String> weekNameColumn = new ArrayColumn<>("星期","weeks.name");
ArrayColumn<String> timeNameColumn = new ArrayColumn<>("時間","weeks.times.time");
ArrayColumn<String> lessonNameColumn = new ArrayColumn<>("課程","weeks.times.lessons.name");
ArrayColumn<String> pointNameColumn = new ArrayColumn<>("知識點","weeks.times.lessons.lessonPoints.name");
ArrayColumn<Boolean> lessonFavColumn = new ArrayColumn<>("是否喜歡","weeks.times.lessons.isFav");
TableData<CollegeStudent> tableData = new TableData<>("課程表",students,studentNameColumn,
weekNameColumn,timeNameColumn,lessonNameColumn,pointNameColumn,lessonFavColumn);
table.setTableData(tableData);
複製程式碼
普通模式也很簡單,只需用
ArrayColumn
代替Column
就可以。不需要任何註解。
由於時間限制,陣列List轉列功能暫不支援動態載入,自動合併 功能。一個類最多可以展示一個List(單層級).後續有時間補上。
複製程式碼
Json資料變成表格
很多時候我們需要展示的資料列不固定,需要根據實時資料來展示,這個時候我們肯定會想到用
Map
key-value
去接收轉換成列。只需要按List
從網上隨便找了
json
資料。
String json="{\"name\":\"BeJson\",\"url\":\"http://www.bejson.com\",\"page\":88,\"isNonProfit\":true,\"links\":[{\"name\":\"Google\",\"url\":\"http://www.google.com\"},{\"name\":\"Baidu\",\"url\":\"http://www.baidu.com\"},{\"name\":\"SoSo\",\"url\":\"http://www.SoSo.com\"},{\"name\":\"Google\",\"url\":\"http://www.google.com\"},{\"name\":\"Baidu\",\"url\":\"http://www.baidu.com\"},{\"name\":\"SoSo\",\"url\":\"http://www.SoSo.com\"},{\"name\":\"Google\",\"url\":\"http://www.google.com\"},{\"name\":\"Baidu\",\"url\":\"http://www.baidu.com\"},{\"name\":\"SoSo\",\"url\":\"http://www.SoSo.com\"},{\"name\":\"Google\",\"url\":\"http://www.google.com\"},{\"name\":\"Baidu\",\"url\":\"http://www.baidu.com\"},{\"name\":\"SoSo\",\"url\":\"http://www.SoSo.com\"}]}";
複製程式碼
和之前一樣,設定表格資料:
MapTableData tableData = MapTableData.create("表格名",JsonHelper.jsonToMapList(json));
table.setTableData(tableData);
複製程式碼
然後呼叫
MapTableData
靜態方法create
建立MapTableData
表格資料類即可,JsonHelper
是輔助Json
轉成Map
集合的。下面生成的表格:

提供了格式化資料,以便null資料可以顯示指定文字,提供攔截器,判斷是否需要攔截該列不顯示。Json解析也支援多層查詢List.
自動合併單元格功能
這個看圖說話

未開啟自動合併效果圖:

開啟自動合併效果圖:

註解模式
@SmartColumn(id =1,name = "姓名",autoMerge = true)
private String name;
@SmartColumn(id=2,name="年齡"autoMerge = true,maxMergeCount = 3)
private int age;
複製程式碼
普通模式
nameColumn.setAutoMerge(true);
ageColumn.setAutoMerge(true);
ageColumn.setMaxMergeCount(3);
複製程式碼
setAutoMerge
就是開啟自動合併,setMaxMergeCount
設定合併最大數量,如果不是設定就是int
最大值。合併規則是根據format
之後value
是否相等來判斷的。
設定表格最小值
很多時候可能我們只有兩三個列,不鋪滿螢幕寬度,感覺好醜,

table.getConfig().setMinTableWidth(screenWith); //設定最小寬度
複製程式碼

是不是美觀很多了呢。寬度會根據之前比例來自動擴大。
其他
加快顯示
如果列的格子只是單行,且列的字型大小都是相同的,你可以設定列
column.setFast(true)
來加快顯示,這樣不用重複計算每個格子寬和高。特別是資料量大的時候,測試顯示快3倍。
demo二維碼:

上面示例都放在demo中,https://github.com/huangyanbin/smartTable,最後謝謝大家支援。
複製程式碼