我正在参加「掘金·启航计划」
以前开发电商项目很少用到关于表格或统计相关功能,现在的公司由于业务类型不同,需要用到大量表格和统计相关功能。通过GitHub和百度、谷歌搜索,发现了能实现效果的相关库——smartTable和MPAndroidChart。这里我们就SmartTable库的使用展开讲解,下一篇再聊下MPAndroidChart的使用记录。
首先先上除GitHub外相关使用资料链接:blog.csdn.net/qq_19688207…
是不是越看越带劲,想要的功能基本都能实现,库的start也高达4.8k+,比较有保障。但即便再优秀的库也不可能满足所有项目的需求,总会有那么几个效果是作者本身没考虑或没实现的。以下就本人踩坑之旅做一个记录。
该库有个比较明显的问题,就是嵌套滑动控件时高度无法展示全,滑动冲突等问题,这里贴出解决方案:www.jianshu.com/p/461998730…
大概原因就是高度计算有问题,需要根据数据来计算控件高度,按照上述链接能够解决该问题。但麻烦不止于此:
- 网络加载数据再填充到表格展示时,仍会出现高度显示不全
- 平均分配表格宽度会出现宽度不一致问题
先说问题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();
}
}
以上是个人开发中遇到的一些小问题,庆幸都解决了。以此做个记录,希望能够帮助大家。