以前写了两篇关于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,最后谢谢你们支持。
复制代码