我正在使用GWT 2.1的CellBrowser和自定义的TreeViewModel。 TreeViewModel反过来使用AsyncDataProvider来动态获取数据。所有这些工作都很漂亮-当用户单击节点时,我的AsyncDataProvider通过RPC获取结果,然后CellBrowser忠实地显示它们。

我无法解决这个问题,感到很傻,但是我如何以编程方式告诉CellBrowser重新加载(并显示)数据?我猜想我需要以某种方式获取我的根节点的AsyncDataProvider的句柄,然后在其上调用updateRowData()和updateRowCount(),但是我看不到一种查询浏览器(或其模型)的明显方法用于根DataProvider。

我想我可以将代码添加到我的AsyncDataProvider构造函数中,以寻找一个空参数,并以此方式识别“嘿,我是根”并将引用存储在某个地方,但这似乎有点黑。当然,有更好的方法可以做到这一点。

很抱歉在这里转储很多代码,但是我不知道如何将其归结为更简单的内容,并且仍然提供足够的上下文。

我的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);

最佳答案

看起来很多人都在使用same issue。这是我处理AsyncDataProvider中的数据刷新的方法。

首先,创建一个接口(interface),该接口(interface)通过包装AsyncDataProvider的 protected onRangeChanged方法来添加刷新数据提供者的功能。例如...

HasRefresh.java

public interface HasRefresh<HasData<T>>{
  /**
   * Called when a display wants to refresh
   *
   * @param display the display to refresh
   */
   void refresh(HasData<T> display);

}

然后需要刷新的CellTable可以通过Activity调用它,或者可以设置 Controller 逻辑。
/**
* A custom {@link AsyncDataProvider}.
*/
public class MyAsyncDataProvider extends
            AsyncDataProvider<Entity> implements HasRefresh<Entity> {

            public void refresh(Entity display){

                  onRangeChanged(display);
             }

             /**
         * {@link #onRangeChanged(HasData)} is called when the table requests a
         * new range of data. You can push data back to the displays using
         * {@link #updateRowData(int, List)}.
         */
        @Override
        protected void onRangeChanged(
                HasData<Entity> display) {
            currentRange = display.getVisibleRange();
            final int start = currentRange.getStart();

            dataServiceQuery = context.getEntities();

            dataServiceQuery
                    .execute(new DataServiceQueryHandler<Entity>() {

                        @Override
                        public void onQueryResponse(
                                DataServiceQueryResponse<Entity> response) {


                            updateRowCount(response.getCount(), true);
                            updateRowData(start, response.getEntities());

                        }
                    });

        }// end onRangeChanged()

    }// end MyAsyncDataProvider class

09-25 21:53