smartTable
smartTable copied to clipboard
Demo数组List转列突然报数下标越界而导致程序崩溃l
错误信息:
Process: com.bin.david.smarttable, PID: 19226 java.lang.ArrayIndexOutOfBoundsException: length=53655; index=53655 at com.bin.david.form.core.TableMeasurer.measureRowHeight(TableMeasurer.java:252) at com.bin.david.form.core.TableMeasurer.getTableWidth(TableMeasurer.java:161) at com.bin.david.form.core.TableMeasurer.measure(TableMeasurer.java:29) at com.bin.david.form.core.SmartTable$2.run(SmartTable.java:262) at java.lang.Thread.run(Thread.java:818)
错误位置:
/**
* 测量行高
* @param config
* @param lineHeightArray
* @param column
* @param position
*/
private void measureRowHeight(TableConfig config, int[] lineHeightArray, Column column, int currentPosition,int position) {
int height =0;
if(column.getRanges() != null && column.getRanges().size() >0){
//如果有合并的情况,将合并的高度分散到各个格子里面去
for(int i = 0; i < column.getRanges().size();i++){
int[] range = (int[]) column.getRanges().get(i);
if(range !=null && range.length ==2){
if(range[0] <= position && range[1] >=position){
height = (column.getDrawFormat().measureHeight(column,range[0],config) +
2*config.getVerticalPadding())/(range[1]- range[0]+1);
}
}
}
}
/* if(tableData.getUserCellRange() != null && tableData.getUserCellRange().size() >0){
//如果有合并的情况,将合并的高度分散到各个格子里面去
for(int i = 0; i < column.getRanges().size();i++){
int[] range = (int[]) column.getRanges().get(i);
if(range !=null && range.length ==2){
if(range[0] <= position && range[1] >=position){
height = (column.getDrawFormat().measureHeight(column,range[0],config) +
2*config.getVerticalPadding())/(range[1]- range[0]+1);
}
}
}
}*/
if(height == 0){
height = column.getDrawFormat().measureHeight(column,position,config) +
2*config.getVerticalPadding();
}
height = Math.max(column.getMinHeight(),height);
if (height > lineHeightArray[currentPosition]) { //这里报错
lineHeightArray[currentPosition] = height;
}
}
兄弟 你又解决的办法吗
没有
我也是这里标错,请问怎么解决?
你应该是间隔时间很短的情况下,调用了两次刷新数据,导致数据有问题,可以加个线程锁 拷贝并新建一个SmartTable 修改刷新方法 /** * 通知更新 */ public void notifyDataChanged() { if (tableData != null) { config.setPaint(paint); //开启线程 new Thread(this::notifyDataChangedSafe).start(); } }
//加个锁,不加锁情况下每两次调用需要间隔一点时间,不允许连续调用两次,否则会有线程问题
private synchronized void notifyDataChangedSafe() {
isNotifying.set(true);
parser.parse(tableData);
TableInfo info = measurer.measure(tableData, config);
xAxis.setHeight(info.getTopHeight());
yAxis.setWidth(info.getyAxisWidth());
requestReMeasure();
postInvalidate();
isNotifying.set(false);
}
/** * 添加数据 * 通过这个方法可以实现动态添加数据,参数isFoot可以实现首尾添加 * * @param t 新增数据 * @param isFoot 是否在尾部添加 */ public void addData(final List<T> t, final boolean isFoot) { if (t != null && t.size() > 0) { new Thread(() -> addDataSafe(t, isFoot)).start(); } }
//线程安全添加数据
private synchronized void addDataSafe(final List<T> t, final boolean isFoot) {
isNotifying.set(true);
parser.addData(tableData, t, isFoot);
measurer.measure(tableData, config);
requestReMeasure();
postInvalidate();
isNotifying.set(false);
}
我的问题是在一个activity中有上下两个表,同时刷新这两个表也是报这个错
它里面有个addData方法,直接用它的方法不会报错