2013-03-04 63 views
1

我已经为我的CellTable设置了一个AsyncDataProvider并将其添加到SimplePager。我已经连接了一个ListHandler来照顾基于列的排序。 当我单击该列的标题时,数据不会改变,但在进入分页器内的下一页/上一页时,数据将被排序。同样在点击列之前,列上没有可视指示符,表明它是可排序的。Gwt使用列排序处理程序的简单寻呼机问题

当我单击列的标题时,如何获取要更新的数据?

这里是我的代码片段

service.getHosts(environment, new AsyncCallback<Set<String>>() {  
     @Override 
     public void onSuccess(final Set<String> hosts) { 
      final List<String> hostList = new ArrayList<String>(hosts); 
      //Populate the table 
      CellTable<String> hostTable = new CellTable<String>(); 
      TextColumn<String> hostNameColumn = new TextColumn<String>(){ 
       @Override 
       public String getValue(String string){ 
        return string; 
       } 
      }; 

      NumberCell numberCell = new NumberCell(); 
      Column<String, Number> lengthColumn = new Column<String, Number>(numberCell){ 

       @Override 
       public Number getValue(String string) { 
        return new Integer(string.length()); 
       } 

      }; 

      AsyncDataProvider<String> dataProvider = new AsyncDataProvider<String>() { 
       @Override 
       protected void onRangeChanged(HasData<String> data) { 
        int start = data.getVisibleRange().getStart(); 
        int end = start + data.getVisibleRange().getLength(); 
        List<String> subList = hostList.subList(start, end); 
        updateRowData(start, subList); 
       } 

      }; 
      // Hooking up sorting 
      ListHandler<String> columnSortHandler = new ListHandler<String>(hostList); 
      columnSortHandler.setComparator(lengthColumn, new Comparator<String>(){ 

       @Override 
       public int compare(String arg0, String arg1) { 
        return new Integer(arg0.length()).compareTo(arg1.length()); 
       } 

      }); 
      hostTable.setPageSize(10); 
      hostTable.addColumnSortHandler(columnSortHandler); 
      hostTable.addColumn(hostNameColumn,"Host Name"); 
      lengthColumn.setSortable(true); 
      hostTable.addColumn(lengthColumn, "Length"); 

      VerticalPanel verticalPanel = new VerticalPanel(); 
      SimplePager pager = new SimplePager(); 
      pager.setDisplay(hostTable); 
      dataProvider.addDataDisplay(hostTable); 
      dataProvider.updateRowCount(hosts.size(), true); 
      verticalPanel.add(hostTable); 
      verticalPanel.add(pager); 
      RootPanel.get().add(verticalPanel); 
     } 

     @Override 
     public void onFailure(Throwable throwable) { 
      Window.alert(throwable.getMessage()); 

     } 
    }); 

我不知道如何确保该列表由表和传呼机都共享。将寻呼机之前,我用

ListDataProvider<String> dataProvider = new ListDataProvider<String>(); 

    ListHandler<String> columnSortHandler = new ListHandler<String>(dataProvider.getList()); 

的AsyncDataProvider没有方法getList

总结我希望数据在列单击后立即排序,而不是在使用分页器控件向前/向后移动后排序。

按照该建议,我已经改变了AsyncDataProvider代码

AsyncDataProvider<String> dataProvider = new AsyncDataProvider<String>() { 
        @Override 
        protected void onRangeChanged(HasData<String> data) { 
         int start = data.getVisibleRange().getStart(); 
         int end = start + data.getVisibleRange().getLength(); 
         List<String> subList = hostList.subList(start, end); 

           // Hooking up sorting 
           ListHandler<String> columnSortHandler = new ListHandler<String>(hostList); 
           hostTable.addColumnSortHandler(columnSortHandler); 
           columnSortHandler.setComparator(lengthColumn, new Comparator<String>(){ 

            @Override 
            public int compare(String v0, String v1) { 
             return new Integer(v0.length).compareTo(v1.length); 
            } 

           }); 
         updateRowData(start, subList); 
        } 

       }; 

但在即使该行为没有任何变化。有人可以请解释过程。 GWT展示应用程序似乎具有此功能,但他们如何做到这一点并不清楚。

回答

3

当使用AsyncDataProvider两个分页和排序都意味着被在服务器端进行。您将需要一个异步处理去与你的AsyncDataProvider:

AsyncHandler columnSortHandler = new AsyncHandler(dataGrid) { 

     @Override 
     public void onColumnSort(ColumnSortEvent event) { 

      @SuppressWarnings("unchecked") 
      int sortIndex = dataGrid.getColumnIndex((Column<Entry, ?>) event.getColumn()); 
      boolean isAscending = event.isSortAscending(); 

      service.getPage(0, sortIndex, isAscending, new AsyncCallback<List<Entry>>() { 

       public void onFailure(Throwable caught) { 
       } 


       public void onSuccess(List<Entry> result) { 

        pager.setPage(0); 
        provider.updateRowData(0, result); 
       } 
      }); 
     } 
    }; 
    dataGrid.addColumnSortHandler(columnSortHandler); 

单击列标题,然后将火columnSortEvent。然后你必须点击列。我重载我的servlet以提供排序和分页,所以当只需要分页时,我为列索引传递-1。

provider = new AsyncDataProvider<Entry>() { 

     @Override 
     protected void onRangeChanged(HasData<Entry> display) { 

      final int start = display.getVisibleRange().getStart(); 

      service.getPage(start, -1, true, new AsyncCallback<List<Entry>>() { 

       @Override 
       public void onFailure(Throwable caught) { 
       } 


       @Override 
       public void onSuccess(List<Entry> result) { 

        provider.updateRowData(start, result); 
       } 
      }); 
     } 
    }; 

    provider.addDataDisplay(dataGrid); 
    provider.updateRowCount(0, true); 

然后你的servlet实现getPage执行排序和分页。整个事情更容易跟随单独的事件处理程序。

+0

有趣的是,我的排序问题是由于双重打算使用onRangedChanged而不是重写AsynchHandler。onColumnSort,那么你需要的一切都来自事件,你避免发射setVisibleRangeAndClearData ...我会稍后更新代码 – Clanomadd 2013-03-30 05:51:09

+0

感谢您的解释。 – nikhil 2013-03-31 12:27:10

+0

没问题,我只是更新了代码以反映onColumnSort事件处理。 – Clanomadd 2013-04-01 14:05:58

1

我认为问题是与ListHandler初始化。您将hostList作为参数传递给List Handler,并将onRangeChange方法传递给您使用不同列表(子列表)调用updateRowData的方法。

Make sure you use the same list in both the places

Move your ListHander initialization and cellTable.addColumnSortHandler method call to onRangeChange method after updateRowData call. 
+1

为此我从同一个列表中传递子列表。我应该做什么改变? – nikhil 2013-03-04 15:50:16

+0

在updateRowData方法调用子列表作为ListHandler的参数后,将ListHander初始化和cellTable.addColumnSortHandler方法调用移动到onRangeChange方法。 – Adarsha 2013-03-05 03:44:38

+0

即使在'onRangeChange'方法中添加处理程序后,我也会得到完全相同的行为。 – nikhil 2013-03-06 09:06:52