GWT CEll浏览器实时更新

时间:2011-01-07 01:42:06

标签: gwt widget

有人能够在运行时正确更新单元格浏览器,即当您删除节点或添加节点时,更改会立即反映在CEll浏览器中,因为我正在使用List并且当我正在制作时更改它没有在现场更新

3 个答案:

答案 0 :(得分:1)

您可以使用ListDataProvider setList(...)方法进行动态更新。以下是我通过RPC更新单元格浏览器的示例:

private void loadAllData(final ListDataProvider<Data> dataProvider) {
    dBservice.getAllData(new AsyncCallback<List<Data>>() {
        public void onSuccess(List<Data> result) {
            dataProvider.setList(result);
        }

        public void onFailure(Throwable caught) {
            caught.printStackTrace();
        }
    });
}

答案 1 :(得分:0)

刷新单元格浏览器必须关闭根节点上的所有子节点。 无论如何这样的事情

for (int i = 0; i < cellBrowser.getRootTreeNode().getChildCount(); i++) {
        cellBrowser.getRootTreeNode().setChildOpen(i, false);
    }

Async DataProvider调用刷新数据

private final class Model implements TreeViewModel{
    private List<ZonaProxy> zonaList = null;
    private List<CategoriaProxy> categoriaList  = null;

    public void setCategoriaList(List<CategoriaProxy> categoriaList) {
        this.categoriaList = categoriaList;
    }

    public void setListZona(List<ZonaProxy> zonaList) {
        this.zonaList = zonaList;
    }

    @SuppressWarnings({ "unchecked", "rawtypes" })
    public <T> NodeInfo<?> getNodeInfo(T value) {
            CategoryDataProvider dataProvider1 = new CategoryDataProvider();
            return new DefaultNodeInfo(dataProvider1, new CategoriaCell());
        }

    /**
     * Check if the specified value represents a leaf node. Leaf nodes cannot be
     * opened.
     */
    public boolean isLeaf(Object value) {
      if (value instanceof CategoriaProxy){
          if (((CategoriaProxy) value).getLivello() == 3) {
              return true;
          }
      }
      return false;
    }

}

private class CategoryDataProvider extends AsyncDataProvider<CategoriaProxy> 
{
    @Override
    protected void onRangeChanged(HasData<CategoriaProxy> display)
    {
        requests.categoriaRequest().findAllCategorias(0, 8).with().fire(new Receiver<List<CategoriaProxy>>() {
            @Override
            public void onSuccess(List<CategoriaProxy> values) {
                updateRowCount(values.size(), true);
                updateRowData(0, values);
            }
        });
    }
}

它有效。

答案 2 :(得分:0)

显然,仅更改数据提供程序并刷新它是不够的。

您还需要强制关闭受影响的单元格并重新打开它,如本例所示

public void updateCellBrowser(String id) {
    TreeNode node = getNode(cellBrowser.getRootTreeNode(),id);

    if(node != null && ! node.isDestroyed()) {
        TreeNode parent = node.getParent();
        int index = node.getIndex();

        parent.setChildOpen(index, false,true);
        parent.setChildOpen(index, true, true);
    }
}

在我的特定示例中,单元ID是路径名,因此如下 getNode()的实现。

private TreeNode getNode(TreeNode node, String id) {
    for(int i=0; i < node.getChildCount(); i++)
            if(node.isChildOpen(i)) {
                Object value = node.getChildValue(i);

                if(value instanceof String) {
                    String nodeId = ((String) value);

                    if(id.equals(nodeId))
                        return node.setChildOpen(i, true);

                    if(id.startsWith(nodeId))
                        getNode(node.setChildOpen(i, true),id);
                }
            }
    return null;
}