【发布时间】:2015-09-22 14:31:02
【问题描述】:
我发现了一个有趣的问题,我想知道我是否误用或忽略了某些内容。我有一个可垂直滚动的大 CellTable。我想一次显示所有行而不是传统的分页。所以在我的表格底部有一行,用户可以单击以加载 50 多行。我为该表提供了一个自定义表生成器 (setTableBuilder(new Builder());)。当用户单击“加载更多”时,我查询数据,添加到 ListDataProvider 并调用 table.setVisibleRange(0, dataProvider.getList().size());。
我把日志语句放在了
@Override
public void buildRowImpl(Object rowValue, int absRowIndex) {
}
查看何时构建行的方法。我注意到它会构建 0-dataProvider.getList().size() (所有行),然后它会构建 oldLength-dataProvider.getList().size() (新行)。例如,如果我有 100 行,然后再加载 50 行,它将构建 0-150,然后再构建 100-50。显然,我想要的是它只构建新行。
所以我开始调试,看看为什么每次都重建整个表。我在 com.google.gwt.user.cellview.client.HasDataPresenter 中发现它会在第 1325 行将“redrawRequired”标志设置为 true:
else if (range1 == null && range0 != null && range0.getStart() == pageStart
&& (replaceDiff >= oldRowDataCount || replaceDiff > oldPageSize)) {
// Redraw if the new data completely overlaps the old data.
redrawRequired = true;
}
所以我的问题是为什么它认为新数据与旧数据完全重叠?
我是不是用错了东西,有没有更好的方法?当它必须重绘数千行不需要重绘的行时,这会变得相当缓慢。
谢谢, 会
【问题讨论】:
标签: gwt datagrid celltable gwt-celltable