GWT: Как программно перезагрузить CellBrowser?

Я использую GWT 2.1 CellBrowser с пользовательской TreeViewModel . TreeViewModel, в свою очередь, использует AsyncDataProvider для динамического извлечения данных. Все это прекрасно работает - когда пользователь нажимает на узел, мой AsyncDataProvider получает результаты через RPC, а CellBrowser послушно их отображает.

Я чувствую себя глупо из-за того, что не могу это понять, но как я могу программно сообщить CellBrowser перезагрузить (и отобразить) данные? Я предполагаю, что мне нужно каким-то образом получить дескриптор AsyncDataProvider для моего корневого узла, а затем вызвать на нем updateRowData () и updateRowCount (), но я не вижу очевидного способа запросить браузер (или его модель) для корневого DataProvider.

Думаю, я мог бы добавить код в свой конструктор AsyncDataProvider, который ищет нулевой аргумент, и тем самым распознает «эй, я корень» и где-то храню ссылку, но это кажется хакерским. Конечно, есть лучший способ сделать это.

Приношу свои извинения за сброс такого количества кода, но я не знаю, как свести это к чему-то более простому и при этом обеспечить достаточный контекст.

My AsyncDataProvider:

private static class CategoryDataProvider extends AsyncDataProvider
{           
    private Category selectedCategory;

    private CategoryDataProvider(Category selectedCategory)
    {
        this.selectedCategory = selectedCategory;
    }

    @Override
    protected void onRangeChanged(HasData display)
    {
        new AsyncCall>()
        {
            @Override
            protected void callService(AsyncCallback> 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 result)
            {
                // update the display
                updateRowCount(result.size(), true);
                updateRowData(0, result);
            }
        }.go();

    }
}

My модель:

private static class CategoryTreeModel implements TreeViewModel
{
    private SingleSelectionModel selectionModel;

    public CategoryTreeModel(SingleSelectionModel selectionModel)
    {
        this.selectionModel = selectionModel;
    }

    /**
     * @return the NodeInfo that provides the children of the specified category
     */
    public  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(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);

9
задан George Armhold 15 January 2011 в 21:13
поделиться