我正在使用 GWT 2.1 的CellBrowser和自定义TreeViewModel
. TreeViewModel 反过来使用AsyncDataProvider
动态获取数据。这一切都很好 - 当用户单击节点时,我的 AsyncDataProvider 通过 RPC 获取结果,并且 CellBrowser 尽职尽责地显示它们。
无法弄清楚这一点我感到很愚蠢,但是我如何以编程方式告诉 CellBrowser 重新加载(并显示)数据?我猜我需要以某种方式为我的根节点获取 AsyncDataProvider 的句柄,然后在其上调用 updateRowData() 和 updateRowCount(),但我看不到查询浏览器(或其模型)的明显方法对于根 DataProvider。
我想我可以将代码添加到我的 AsyncDataProvider 构造函数中以查找空参数,并通过这种方式识别“嘿,我是根”并在某处存储引用,但这似乎很骇人听闻。当然有更好的方法来做到这一点。
很抱歉在这里倾倒了这么多代码,但我不知道如何将其归结为更简单的东西并且仍然提供足够的上下文。
我的异步数据提供者:
private static class CategoryDataProvider extends AsyncDataProvider<Category>
{
private Category selectedCategory;
private CategoryDataProvider(Category selectedCategory)
{
this.selectedCategory = selectedCategory;
}
@Override
protected void onRangeChanged(HasData<Category> display)
{
new AsyncCall<List<Category>>()
{
@Override
protected void callService(AsyncCallback<List<Category>> cb)
{
// default to root
String categoryId = "-1";
if (selectedCategory != null)
{
categoryId = selectedCategory.getCategoryId();
}
// when a category is clicked, fetch its child categories
service.getCategoriesForParent(categoryId, cb);
}
@Override
public void onSuccess(List<Category> result)
{
// update the display
updateRowCount(result.size(), true);
updateRowData(0, result);
}
}.go();
}
}
我的模型:
private static class CategoryTreeModel implements TreeViewModel
{
private SingleSelectionModel<Category> selectionModel;
public CategoryTreeModel(SingleSelectionModel<Category> selectionModel)
{
this.selectionModel = selectionModel;
}
/**
* @return the NodeInfo that provides the children of the specified category
*/
public <T> NodeInfo<?> getNodeInfo(T value)
{
CategoryDataProvider dataProvider = new CategoryDataProvider((Category) value);
// Return a node info that pairs the data with a cell.
return new TreeViewModel.DefaultNodeInfo<Category>(dataProvider, new CategoryCell(), selectionModel, null);
}
/**
* @return true if the specified category represents a leaf node
*/
public boolean isLeaf(Object value)
{
return value != null && ((Category) value).isLeafCategory();
}
}
最后,这是我使用它们的方式:
CategoryTreeModel model = new CategoryTreeModel(selectionModel);
CellBrowser cellBrowser = new CellBrowser(model, null);