Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/gwt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/visual-studio-2010/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
GWT:如何以编程方式重新加载CellBrowser?_Gwt_Cellbrowser - Fatal编程技术网

GWT:如何以编程方式重新加载CellBrowser?

GWT:如何以编程方式重新加载CellBrowser?,gwt,cellbrowser,Gwt,Cellbrowser,我将GWT2.1与一个定制的treeviwmodel一起使用。TreeViewModel反过来使用AsyncDataProvider动态获取数据。这一切都很完美——当用户单击节点时,我的AsyncDataProvider通过RPC获取结果,CellBrowser尽职尽责地显示结果 我觉得自己很傻,因为我没能弄明白这一点,但是我怎么能通过编程告诉CellBrowser重新加载(并显示)数据呢?我猜我需要以某种方式获得根节点的AsyncDataProvider的句柄,然后在其上调用updateRow

我将GWT2.1与一个定制的
treeviwmodel
一起使用。TreeViewModel反过来使用
AsyncDataProvider
动态获取数据。这一切都很完美——当用户单击节点时,我的AsyncDataProvider通过RPC获取结果,CellBrowser尽职尽责地显示结果

我觉得自己很傻,因为我没能弄明白这一点,但是我怎么能通过编程告诉CellBrowser重新加载(并显示)数据呢?我猜我需要以某种方式获得根节点的AsyncDataProvider的句柄,然后在其上调用updateRowData()&updateRowCount(),但我没有看到一种明显的方法来查询浏览器(或其模型)中的根数据提供程序

我想我可以将代码添加到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);

看起来很多人都有这种情况。下面是我如何处理从AsyncDataProvider刷新数据的过程

首先,创建一个接口,通过包装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);

}
公共接口刷新{
/**
*当显示器需要刷新时调用
*
*@param显示要刷新的显示
*/
无效刷新(数据显示);
}
然后,需要刷新的CellTable可以通过活动调用它,或者不管控制器逻辑是如何设置的

/**
* 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
/**
*自定义{@link AsyncDataProvider}。
*/
公共类MyAsyncDataProvider扩展
AsyncDataProvider实现HasRefresh{
公共无效刷新(实体显示){
改变范围(显示);
}
/**
*当表请求
*新的数据范围。您可以使用
*{@link#updateRowData(int,List)}。
*/
@凌驾
已更改受保护的无效范围(
(数据显示){
currentRange=display.getVisibleRange();
final int start=currentRange.getStart();
dataServiceQuery=context.getEntities();
数据服务查询
.execute(新的DataServiceQueryHandler(){
@凌驾
公共无效查询响应(
DataServiceQueryResponse(响应){
updateRowCount(response.getCount(),true);
updateRowData(start,response.getEntities());
}
});
}//结束onRangeChanged()
}//结束MyAsyncDataProvider类

现在发现,以下代码基本相同,但来自HasData接口,而不是使用AsyncDataProvider

HasData<T> display;
...
display.setVisibleRangeAndClearData(display.getVisibleRange(), true);
has数据显示;
...
display.setVisibleRange和ClearData(display.getVisibleRange(),true);

我不明白为什么和蔼可亲的家伙的答案被标记为“正确”并且被如此高估

咖啡碱昏迷询问更新单元格浏览器,而不是单元格表,这是完全不同的事情

对我来说,以下技巧奏效了: 我在
treeviwmodel
之外定义
DataProvider
s,并将它们作为参数传递给构造函数。在我的例子中,它们在开始时提供空的数据结构

现在,您可以从“外部”引用
数据提供程序
s以更新单元格浏览器

例如:

private class MyTreeViewModel implements TreeViewModel {

    AbstractDataProvider<MyDataStructure> myDataProvider;

    public MyTreeViewModel(AbstractDataProvider<MyDataStructure> myDataProvider)
    {
        this.myDataProvider = myDataProvider;
    }

    @Override
    public <T> NodeInfo<?> getNodeInfo(T value) {
        if(value == null)
        {
            // Level 0
            return new DefaultNodeInfo<MyDataStructure>(myDataProvider, new MyCellImpl());
        }
    }
}


AbstractDataProvider<MyDataStructure> myDataProvider = new ListDataProvider<MyDataStructure>(new ArrayList<MyDataStructure>()); // or AsyncDataProvider
MyTreeViewModel myModel = new MyTreeViewModel(myDataProvider);

CellBrowser<MyDataStructure> cellBrowser = new CellBrowser.Builder<MyDataStructure>(myModel, null).build();

/*
  here you can do some stuff, for example, bind the CellBrowser to a template with UiBinder
*/

/*
 if you use a ListDataProvider, do
*/

myDataProvider.setList(myDataStructureFromSomewhere);
myDataProvider.refresh();

/*
 if you use an AsyncDataProvider, do
*/

myDataProvider.updateRowData(..., myDataStructureFromSomewhere);
myDataProvider.updateRowCount(...);
私有类MyTreeViewModel实现TreeViewModel{
抽象数据提供者myDataProvider;
公共MyTreeViewModel(AbstractDataProvider myDataProvider)
{
this.myDataProvider=myDataProvider;
}
@凌驾
公共节点信息getNodeInfo(T值){
如果(值==null)
{
//0级
返回新的DefaultNodeInfo(myDataProvider,new MyCellImpl());
}
}
}
AbstractDataProvider myDataProvider=新建ListDataProvider(新建ArrayList());//或异步数据提供程序
MyTreeView模型myModel=新的MyTreeView模型(myDataProvider);
CellBrowser CellBrowser=新建CellBrowser.Builder(myModel,null).build();
/*
在这里,您可以执行一些操作,例如,使用UiBinder将CellBrowser绑定到模板
*/
/*
如果使用ListDataProvider,请执行以下操作:
*/
设置列表(mydatastructurefromwhere);
myDataProvider.refresh();
/*
如果使用AsyncDataProvider,请执行以下操作:
*/
myDataProvider.updateRowData(…,MyDatastructure fromwhere);
myDataProvider.updateRowCount(…);

我也有同样的问题,这对我很有效:

 List<TreeGridRecord> dataToTable = ....

int firstPosition = this.pager.getDisplay().getVisibleRange().getStart();
this.dataProvider.updateRowData(firstPosition, dataToTable);

int rowCount = this.pager.getPageStart() + dataToTable.size();
this.dataProvider.updateRowCount(rowCount, exactCount);
List dataToTable=。。。。
int firstPosition=this.pager.getDisplay().getVisibleRange().getStart();
this.dataProvider.updateRowData(firstPosition,dataToTable);
int rowCount=this.pager.getPageStart()+dataToTable.size();
this.dataProvider.updateRowCount(rowCount,exactCount);
其中“分页器”是一个简单的分页器,用于控制表格分页


希望这有帮助

在“HashRefresh”上输入错误,但在其他情况下为+1:)为什么每个人都投票支持这个答案?下面的一个更好—一行更改就可以完成所有这一切。updateRowData(start,response.getEntities())更新提供程序的所有显示,您可以改为使用updateRowData(display,start,response.getEntities())。但是display.setVisibleRange和ClearData(display.getVisibleRange(),true)更好:)看看Hugo的答案。它实际上回答了OP关于CellBrowser而不是CellTable的问题。谢谢你提供这个答案。它工作得很好。我一直在想我是怎么做到的