开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 6天,点击查看活动详情
去年因项目需求,接入了SmartTable,因此踩了很多坑,最后勉强达到了项目需求,后来整理成文发布了一篇文章作为记录——Android SmartTable(表格库)使用历程
没想到后来项目中对表格的使用越发的多,很多页面需要展示数据,甚至表格中还有些需要自定义的按钮或图标。有按钮还得有点击事件,另外之前采用的表单模式配置也比较死板,一旦数据量大或者使用的地方多,基本就靠手动码代码了。这样后期维护和可读性太差,于是我决定再次研究下这个库,优化的同时还能实现各种突发情况。
查看demo和阅读源码发现,表格可以分为几种模式:表单模式、注解模式、解析模式。
表单模式
之前使用的即是表单模式,通过创建实现IForm接口实体的二维数组来填充表格数据,现在打算弃用。
注解模式
在实体上使用@SmartTable注解,内部属性使用@SmartColumn,如果表格是一行拆分多行就需要使用type: @SmartColumn(type= ColumnType.Child),一般这类模式适用于复杂表格,横竖排格子数不相等,也就是拆分格的表格。
@SmartTable(name="学生信息列表",count = true)
public class Student {
@SmartColumn(id =1,name = "姓名",autoCount = true)
private String name;
@SmartColumn(id =7,name="更新时间")
private long time;
@SmartColumn(type= ColumnType.Child)
private ChildData childData;
@SmartColumn(id =6,name="选中")
private boolean isCheck;
......
}
解析模式
通过Column创建分类名和对应值,第一个参数代表分类名,第二个代表实体对应字段名。
final Column<String> nameColumn = new Column<>("姓名", "name");
或者通过Map将数据以键值对形式入参MapTableData,需要注意的是这里的Map需要使用LinkedHashMap,因为这是有序的,如果使用HashMap生成的表格数据会乱序。
List<Object> list = new ArrayList<>();
for (int i = 0; i < 10; i++) {
Map<String, Object> map = new LinkedHashMap<>();
map.put("姓名", "张三");
list.add(map);
}
MapTableData tableData = MapTableData.create("测试", list);
我们看到TableData实际是有四个已经写好的实现类的,对应的是不同方式的表格生成模式
这次升级中因表格横竖格子都是相同的所以选择了解析模式,使用起来也很方便。当然注解模式也可实现,但需要每个使用的属性都要写上注解,个人感觉还是比较麻烦。
最开始使用了Map方式,看起来最方便,但不知为何表头分类始终显示不出来,最终也没能解决。所以目前使用的还是通过Column创建表格,其实也还是比较简单。需要注意的就是第二个字段一定要和实体类的属性对应上,否则无法解析。
TableData(
"测试",
list,
getColumn<String>("姓名", "name"),
getColumn<String>("年龄", "age"),
getColumn<String>("性别", "sex")
)
data class PeoPle(
val name: String = "",
val age: String = "",
val sex: String = ""
)
表格的模式确定后,剩下的是处理表格内的按钮和点击事件
不得不说这个库是真优秀,基本你能想到的情况都考虑到位了。它提供了一setContentCellBackgroundFormat方法,根据方法名可知,设置格子背景相关的方法。需要实现一个 ICellBackgroundFormat接口:
public interface ICellBackgroundFormat<T> {
/**
* 绘制背景
*/
void drawBackground(Canvas canvas, Rect rect,T t, Paint paint);
/**
*当背景颜色改变字体也需要跟随变化
*/
int getTextColor(T t);
}
可以看到drawBackground中提供了自定绘图的所需的工具,那么想干什么都可以。当然,上天肯定不行。格子的内容得以解决,接下来是点击事件。
tableDatas.setOnItemClickListener { column, value, t, col, row ->
if (col == 7) {
......
}
}
TableData提供了点击事件,我们做的就是分清楚格子的坐标点,横向和纵向也就是col和row。
这里再说说其中遇到或者一开发中遇到的功能: 因为设置了表格限宽,但内边距其实是不参与计算的,所以还是会出现表格分配不均问题。表格默认是有内边距的,分为横向和纵向边距,我们需要根据情况手动设置内边距
columnTitleHorizontalPadding = requireActivity().dp2px(2f)//标题横向pading
columnTitleVerticalPadding = requireActivity().dp2px(8f)//标题纵向pading
网格线的颜色和标题栏网格颜色都需单独设置
//设置网格线条颜色
contentGridStyle = LineStyle().apply {
color = ContextCompat.getColor(requireContext(), R.color.cl_C4C8CE)
}
//设置标题网格线条颜色
columnTitleGridStyle=LineStyle().apply {
color = ContextCompat.getColor(requireContext(), R.color.cl_C4C8CE)
}
//标题背景
columnTitleBackground =
BaseBackgroundFormat(ContextCompat.getColor(requireContext(), R.color.cl_DCDEE2))
//标题字体颜色
columnTitleStyle = FontStyle().apply {
textColor = ContextCompat.getColor(requireContext(), R.color.cl_2C2C2C)
}
SmartTable只能嵌套在滑动控件的第一层,否则滑动还是会冲突。
总结
对于功能强大的三方库要保持耐心,细心阅读源码,多看demo对比发现其中的不同和共同之处。最主要还是了解其原理。虽然很多三方库不再维护,或者功能不满足项目需求,这时更是考验自己能力的时候。最后发现其实也是蛮简单的,前人栽树后人乘凉,别人基本都给你写好了,你只是查漏补缺。
以上是对项目中SmartTable使用的再次优化,希望对大家使用有所帮助!
开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 6天,点击查看活动详情