以前寫了兩篇關於Android表格的文章,受到不少同窗的喜歡。github地址一些同窗提出了新的需求。因爲我的精力有限,只能增長我的比較實用的部分功能。下面介紹兩個新功能。git
附上以前兩篇文章的地址github
這個功能標題有點坑,舉個栗子:bash
舉個咱們熟悉的課程表例子,一個學生
student
,每一個星期7天,每一天有上午,下午,晚上dayTime
3個時段,每一個時間段有具體的課Lesson
。這個課程學生是否喜歡isFav
,課程下面有課程的知識點LessonPoint
,咱們想用表格展現一個班級裏面全部學生的課程表。框架
固然真實的需求可能沒有這麼多層級,哈哈,產品不可能這麼變態這裏。只是爲了驗證多層級是否能夠正確展現。效果以下:less
學生類post
@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(單層級).後續有時間補上。
複製代碼
不少時候咱們須要展現的數據列不固定,須要根據實時數據來展現,這個時候咱們確定會想到用
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,最後謝謝你們支持。
複製代碼