好用漂亮的Android 表格框架3

黃燕斌發表於2018-02-07
前言

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

好用漂亮的Android 表格框架3

附上之前兩篇文章的地址

好用漂亮的Android 表格框架

好用漂亮的Android 表格框架2

陣列或者List轉列

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

好用漂亮的Android 表格框架3

舉個我們熟悉的課程表例子,一個學生 student,每個星期7天,每一天有上午,下午,晚上dayTime3個時段,每個時間段有具體的課Lesson。這個課程學生是否喜歡isFav,課程下面有課程的知識點LessonPoint,我們想用表格展示一個班級裡面所有學生的課程表。

當然真實的需求可能沒有這麼多層級,哈哈,產品不可能這麼變態這裡。只是為了驗證多層級是否可以正確展示。效果如下:

好用漂亮的Android 表格框架3

註解模式

學生類

  @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集合的。下面生成的表格:

好用漂亮的Android 表格框架3

提供了格式化資料,以便null資料可以顯示指定文字,提供攔截器,判斷是否需要攔截該列不顯示。Json解析也支援多層查詢List.

自動合併單元格功能

這個看圖說話

好用漂亮的Android 表格框架3

未開啟自動合併效果圖:

好用漂亮的Android 表格框架3

開啟自動合併效果圖:

好用漂亮的Android 表格框架3

註解模式
   @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是否相等來判斷的。

設定表格最小值

很多時候可能我們只有兩三個列,不鋪滿螢幕寬度,感覺好醜,

好用漂亮的Android 表格框架3

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

好用漂亮的Android 表格框架3

是不是美觀很多了呢。寬度會根據之前比例來自動擴大。

其他
加快顯示

如果列的格子只是單行,且列的字型大小都是相同的,你可以設定列column.setFast(true)來加快顯示,這樣不用重複計算每個格子寬和高。特別是資料量大的時候,測試顯示快3倍。

demo二維碼:

好用漂亮的Android 表格框架3

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

相關文章