smartTable
smartTable copied to clipboard
表格大概率需要手指触摸一下才会显示出来,请问有遇到这个问题吗,怎么解决的,我看前面有人提问,但是没有解答方法?
setTableData之后调用invalidate()也没有效果,还是需要点击一下,表格才会显示出来
我也遇到了这个问题,刷新没用,除非手动触摸后刷新,老哥解决没用
我也遇到了这个问题,刷新没用,除非手动触摸后刷新,老哥解决没用
没呢,我搜了前面的问题,也有人问,说是用invalidata()方法,发现没有效果
已经解决了,可以参考下
1,自己写一个类,内容全部复制SmartTable
2,修改notifyDataChanged()方法,把new Thread().start();删掉,直接在主线程运行
3,setTableData();后调用invalidate();
已经解决了,可以参考下
1,自己写一个类,内容全部复制SmartTable
2,修改notifyDataChanged()方法,把new Thread().start();删掉,直接在主线程运行
3,setTableData();后调用invalidate();
按你说的方式确实可以了,直接setTableData也能达到效果了,感谢
我是先setTableData(tableData),然后调用runOnUiThread(),在里面调用invalidate()
兄弟你再主线程做耗时操作也有风险吧。 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);
}
兄弟你再主线程做耗时操作也有风险吧。 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也没有效果
上次贴漏了,把这行加上,就不用点一下了 /** * 通知重绘 * 增加锁机制,避免闪屏和数据更新异常 */ @Override public void invalidate() { // if (!isNotifying.get()) { super.invalidate(); // } }
根据
@Override
public void invalidate() {
if (!isNotifying.get()) {
super.invalidate();
}
}
可知必须:
isNotifying.set(false);//设置没有正在计算中
postInvalidate();//提交主线程重绘
解决办法,复制SmartTable,将
postInvalidate();
sNotifying.set(false);
调用顺序修改为为
isNotifying.set(false);
postInvalidate();
请问最后怎么解决的,还有问题么