Android:优化和升级项目中的SmartTable

开启掘金成长之旅!这是我参与「掘金日新计划 · 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实际是有四个已经写好的实现类的,对应的是不同方式的表格生成模式

1675908958420.jpg

这次升级中因表格横竖格子都是相同的所以选择了解析模式,使用起来也很方便。当然注解模式也可实现,但需要每个使用的属性都要写上注解,个人感觉还是比较麻烦。

最开始使用了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 = ""
)

表格的模式确定后,剩下的是处理表格内的按钮和点击事件

1675909918085.jpg

不得不说这个库是真优秀,基本你能想到的情况都考虑到位了。它提供了一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天,点击查看活动详情