GWT在CellTable中填充行

时间:2013-04-22 15:45:02

标签: gwt celltable

我目前有CellTable,我使用过滤器/分页/排序进行了扩展。 我正在努力添加更多功能。

但是,有一件事让我感到困惑,那就是当你将页面的限制设置为例如10时。 如果一个对象没有10行并且只有5个并且您在它们之间切换,那么如果该表位于中心,则该表将上下跳转。

是否有一种优雅的方式,当pageSize设置为10时,如果表中少于10行,则会添加空行?

到目前为止,我尝试过的方法会影响我的过滤/排序/分页,这是我不想要的。

编辑1:

final AsyncDataProvider<Row> provider = new AsyncDataProvider<Row>() {

      @Override
      protected void onRangeChanged(HasData<Row> display) {

        int start = display.getVisibleRange().getStart();
        int end = start + display.getVisibleRange().getLength();
        end = end >= rows.getFilterList().size() ? rows.getFilterList().size() : end;
        List<Row> sub = rows.getFilterList().subList(start, end);
        System.out.println("Checking if extra rows needed: " +
                                           table.getVisibleItems().size());

               for(int i = table.getVisibleItems().size(); i<10; i++){
                     System.out.println("ADDED EMPTY ROW");
                     sub.add(new Row());
               }

         updateRowData(start, sub);
     }
};

1 个答案:

答案 0 :(得分:2)

我遇到了同样的问题。我通过添加null行来解决它。基本上,您需要覆盖onRangeChange(HasData<T> display)中的DataProvider,将null添加到代表所要求范围的列表中。您可以添加足够的null来填充所需的范围。

@Override
protected void onRangeChanged(HasData<T> display){

    Range range = display.getVisibleRange();

    List<T> listOfObjects = getRange(range);

    for(int i=listOfObject.size(); i<range.getLength(); i++){
        listOfObjects.add(null);
    }

    updateRowData(range.getStart(), listofObjects);

}

在上面的代码getRange()中返回一个包含所请求对象的列表(在该范围内)

您还需要添加一些CSS来为行提供高度。如果你没有指定高度,那么行将非常小,因此它们不会填充整个表格。

令人失望的是GWT不支持这种类型的填充。这种方式是我发现的最好的方式,但不幸的是,当你的行高在一张桌子内不同时,它会让一切变得更难。

<强>寻呼

使用上述解决方案,如果您需要分页,则需要自定义Pager。您可以使用AsyncDataProvider之类的方法扩展getVisibleRowCount(),这将返回当前子列表中实际数据中的对象数量(不是null)。然后,您可以将AsyncDataProvider的引用提供给Pager并覆盖createText()方法:

@Override
protected String createText(){

    return getPageStart() + " - " + dataProvider.getVisibileRowCount() + " of "
                 + dataProvider.getTotalRowCount(); 

}