好用漂亮的Android 表格框架3

前言

以前寫了兩篇關於Android表格的文章,受到不少同窗的喜歡。github地址一些同窗提出了新的需求。因爲我的精力有限,只能增長我的比較實用的部分功能。下面介紹兩個新功能。git

附上以前兩篇文章的地址github

好用漂亮的Android 表格框架json

好用漂亮的Android 表格框架2數組

數組或者List轉列

這個功能標題有點坑,舉個栗子:bash

舉個咱們熟悉的課程表例子,一個學生 student,每一個星期7天,每一天有上午,下午,晚上dayTime3個時段,每一個時間段有具體的課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 註解有個類型typeColumnType.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舉例:

從網上隨便找了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,最後謝謝你們支持。
複製代碼
相關文章
相關標籤/搜索