好用漂亮的Android 表格框架3

2018-02-08 10:21:28来源:https://juejin.im/post/5a7a8eef5188257a84621eda作者:稀土掘金人点击

分享

之前写了两篇关于Android表格的文章,受到很多同学的喜欢。 github地址 一些同学提出了新的需求。由于个人精力有限,只能增加个人比较实用的部分功能。下面介绍两个新功能。





附上之前两篇文章的地址


好用漂亮的Android 表格框架


好用漂亮的Android 表格框架2


数组或者List转列

这个功能标题有点坑,举个栗子:





举个我们熟悉的课程表例子,一个学生 student ,每个星期7天,每一天有上午,下午,晚上 dayTime 3个时段,每个时间段有具体的课 Lesson 。这个课程学生是否喜欢,课程下面有课程的知识点 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(单层级).后续有时间补上。
自动合并单元格功能

这个看图说话





未开启自动合并效果图:





开启自动合并效果图:





注解模式
@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中,https://github.com/huangyanbin/smartTable,最后谢谢大家支持。

微信扫一扫

第七城市微信公众平台