2013-03-04 4 views
1

Я установил AsyncDataProvider для моей CellTable и добавил его в 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 как разбиение на страницы и сортировки предназначены быть сделано на стороне сервера. Вам потребуется AsyncHandler идти с 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. Затем вам нужно щелкнуть по столбцу. Я перегружаю свой сервлет, чтобы обеспечить сортировку и разбивку на страницы, поэтому я передаю -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); 

Затем ваша реализация сервлета getPage выполняет сортировку и разбивку на страницы. Все это намного проще отслеживать с отдельными обработчиками событий.

+0

Интересно, что моя проблема с сортировкой была вызвана двойным назначением onRangedChanged вместо переопределения AsynchHandler.onColumnSort, тогда все, что вам нужно, происходит от события, и вы избегаете стрельбы setVisibleRangeAndClearData ... Я обновлю код позже – Clanomadd

+0

Спасибо за объяснение. – nikhil

+0

Нет проблем, я просто обновил код, чтобы отразить обработку событий onColumnSort. – Clanomadd

1

Я думаю, что проблема связана с инициализацией ListHandler. Вы передаете hostList в качестве параметра обработчику списка и методу 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

+0

Переместите инициализацию ListHander и метод cellTable.addColumnSortHandler, чтобы вызвать метод onRangeChange после вызова метода updateRowData с подписок в качестве параметра ListHandler. – Adarsha

+0

Это тоже не работает. Я получаю то же самое поведение даже после добавления обработчика внутри метода 'onRangeChange'. – nikhil

Смежные вопросы