smartTable icon indicating copy to clipboard operation
smartTable copied to clipboard

表格大概率需要手指触摸一下才会显示出来,请问有遇到这个问题吗,怎么解决的,我看前面有人提问,但是没有解答方法?

Open yihaha opened this issue 5 years ago • 11 comments

yihaha avatar May 24 '19 02:05 yihaha

setTableData之后调用invalidate()也没有效果,还是需要点击一下,表格才会显示出来

yihaha avatar May 24 '19 02:05 yihaha

我也遇到了这个问题,刷新没用,除非手动触摸后刷新,老哥解决没用

chainsuper avatar May 24 '19 03:05 chainsuper

我也遇到了这个问题,刷新没用,除非手动触摸后刷新,老哥解决没用

没呢,我搜了前面的问题,也有人问,说是用invalidata()方法,发现没有效果

yihaha avatar May 24 '19 06:05 yihaha

已经解决了,可以参考下

1,自己写一个类,内容全部复制SmartTable 图片

2,修改notifyDataChanged()方法,把new Thread().start();删掉,直接在主线程运行 图片

3,setTableData();后调用invalidate(); 图片

chainsuper avatar May 24 '19 07:05 chainsuper

已经解决了,可以参考下

1,自己写一个类,内容全部复制SmartTable 图片

2,修改notifyDataChanged()方法,把new Thread().start();删掉,直接在主线程运行 图片

3,setTableData();后调用invalidate(); 图片

按你说的方式确实可以了,直接setTableData也能达到效果了,感谢

yihaha avatar May 24 '19 09:05 yihaha

我是先setTableData(tableData),然后调用runOnUiThread(),在里面调用invalidate()

KuriZJT avatar Aug 27 '19 05:08 KuriZJT

兄弟你再主线程做耗时操作也有风险吧。 new Thread 保留,可以加个线程锁

拷贝并新建一个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

兄弟你再主线程做耗时操作也有风险吧。 new Thread 保留,可以加个线程锁

拷贝并新建一个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, 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);
}

好像不行啊 按照你的改了之后 setdata 也是空白 需要点一下 调用 invalidate也没有效果

LuoCang avatar May 27 '20 08:05 LuoCang

上次贴漏了,把这行加上,就不用点一下了 /** * 通知重绘 * 增加锁机制,避免闪屏和数据更新异常 */ @Override public void invalidate() { // if (!isNotifying.get()) { super.invalidate(); // } }

FinleyLC avatar May 27 '20 09:05 FinleyLC

根据
@Override public void invalidate() { if (!isNotifying.get()) { super.invalidate(); } } 可知必须: isNotifying.set(false);//设置没有正在计算中 postInvalidate();//提交主线程重绘 解决办法,复制SmartTable,将 postInvalidate(); sNotifying.set(false); 调用顺序修改为为 isNotifying.set(false); postInvalidate();

houyuehai avatar Jun 07 '21 02:06 houyuehai

请问最后怎么解决的,还有问题么

XiaoRanLiu3119 avatar Apr 08 '24 10:04 XiaoRanLiu3119