Gwt简单分页器问题与列排序处理程序



我已经为我的CellTable设置了一个AsyncDataProvider并将其添加到SimplePager中。我已经连接了一个ListHandler来处理基于列的排序。当我单击该列的标题时,数据不会改变,但在页面内转到下一页/上一页时,数据将被排序。此外,在单击列之前,列上没有可视指示符表明该列是可排序的。

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

我的代码片段

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展示应用程序似乎有这个功能,但他们是如何做到的并不是很清楚。

当使用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。然后你必须点击这个列。为了同时提供排序和分页,我重载了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);

然后getPage的servlet实现执行排序和分页。如果使用单独的事件处理程序,整个过程就容易多了。

我认为问题在于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.

最新更新