Android SmartTable(表格库)使用历程

我正在参加「掘金·启航计划」

以前开发电商项目很少用到关于表格或统计相关功能,现在的公司由于业务类型不同,需要用到大量表格和统计相关功能。通过GitHub和百度、谷歌搜索,发现了能实现效果的相关库——smartTableMPAndroidChart。这里我们就SmartTable库的使用展开讲解,下一篇再聊下MPAndroidChart的使用记录。

首先先上除GitHub外相关使用资料链接:blog.csdn.net/qq_19688207…

是不是越看越带劲,想要的功能基本都能实现,库的start也高达4.8k+,比较有保障。但即便再优秀的库也不可能满足所有项目的需求,总会有那么几个效果是作者本身没考虑或没实现的。以下就本人踩坑之旅做一个记录。

该库有个比较明显的问题,就是嵌套滑动控件时高度无法展示全,滑动冲突等问题,这里贴出解决方案:www.jianshu.com/p/461998730…

大概原因就是高度计算有问题,需要根据数据来计算控件高度,按照上述链接能够解决该问题。但麻烦不止于此:

  1. 网络加载数据再填充到表格展示时,仍会出现高度显示不全
  2. 平均分配表格宽度会出现宽度不一致问题

先说问题1:
通过反复调试发现,仅当网络加载数据方式展示表格时高度显示不全,本地加载死数据时是能够展示完整表格的。这说明是时机问题,控件高度计算已经完成了数据才获取并填充,还记得上面解决滑动问题重写的计算高度方法吗?尝试延迟调用该方法,重新计算高度,应该能解决这个棘手的问题。

//重新计算表格高度
table.postDelayed({ (table as CustomSmartTable<*>).requestReMeasure() }, 300)

再说问题2:
多次调试发现,平分宽度的情况下,仅当文字内容长度相等时,表格的宽度才会相同(使用表单模式)。这设计感觉有些不合理啊,没办法只能看看有没有别的办法可以限制。通过查看源码发现其中有个叫做setDrawFormat的方法可以重写格式,其中有个MultiLineDrawFormat实现类可以限制表格宽度使用文字换行达到平分表格效果。另外也可通过setMinWidth设置最小宽度达到预期效果。

public class MultiLineDrawFormat<T> extends TextDrawFormat<T> {

    private int width;
    private TextPaint textPaint = new TextPaint(Paint.ANTI_ALIAS_FLAG);

    /**
     * 多行文字格式化构造方法
     *
     * @param width 指定宽度 px
     */
    public  MultiLineDrawFormat(int width) {
        this.width = width;
    }

    /**
     * 多行文字格式化构造方法
     *
     * @param dpWidth 指定宽度 dp
     */
    public  MultiLineDrawFormat(Context context,int dpWidth) {
        this.width = DensityUtils.dp2px(context,dpWidth);
    }

    @Override
    public int measureWidth(Column<T> column,int position, TableConfig config) {

        return width;
    }

    @Override
    public int measureHeight(Column<T> column, int position, TableConfig config) {
        config.getContentStyle().fillPaint(textPaint);
        StaticLayout sl = new StaticLayout(column.format(position), textPaint, width, Layout.Alignment.ALIGN_NORMAL, 1.0f, 0.0f, false);
        return sl.getHeight();
    }

    @Override
    public void draw(Canvas c, Rect rect, CellInfo<T> cellInfo ,TableConfig config) {
        setTextPaint(config, cellInfo, textPaint);
        if(cellInfo.column.getTextAlign() !=null) {
            textPaint.setTextAlign(cellInfo.column.getTextAlign());
        }
        int hPadding = (int) (config.getHorizontalPadding()*config.getZoom());
        int realWidth =rect.width() - 2*hPadding;
        StaticLayout staticLayout = new StaticLayout(cellInfo.column.format(cellInfo.row), textPaint, realWidth, Layout.Alignment.ALIGN_NORMAL, 1.0f, 0.0f, false);
        c.save();
        c.translate(DrawUtils.getTextCenterX(rect.left+hPadding,rect.right-hPadding,textPaint), rect.top+(rect.height()-staticLayout.getHeight())/2);
        staticLayout.draw(c);
        c.restore();
    }
}

以上是个人开发中遇到的一些小问题,庆幸都解决了。以此做个记录,希望能够帮助大家。