smartTable icon indicating copy to clipboard operation
smartTable copied to clipboard

Demo数组List转列突然报数下标越界而导致程序崩溃l

Open bihailantian opened this issue 5 years ago • 6 comments

错误信息:

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;
    }
}

bihailantian avatar Mar 06 '19 10:03 bihailantian

兄弟 你又解决的办法吗

NeVaDaAAA avatar Mar 13 '19 08:03 NeVaDaAAA

没有

bihailantian avatar Mar 21 '19 07:03 bihailantian

我也是这里标错,请问怎么解决?

ssiyy avatar Jul 29 '19 02:07 ssiyy

你应该是间隔时间很短的情况下,调用了两次刷新数据,导致数据有问题,可以加个线程锁 拷贝并新建一个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);
}

FinleyLC avatar Sep 05 '19 01:09 FinleyLC

我的问题是在一个activity中有上下两个表,同时刷新这两个表也是报这个错

TonywithZhang avatar Aug 20 '20 05:08 TonywithZhang

它里面有个addData方法,直接用它的方法不会报错

yanghuabang avatar Sep 03 '20 03:09 yanghuabang