1

我为 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 展示应用程序似乎具有此功能,但他们如何做到这一点并不那么清楚。

4

2 回答 2

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。然后,您必须单击该列。我正在重载我的 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 实现执行排序和分页。使用单独的事件处理程序更容易理解整个事情。

于 2013-03-29T17:17:35.410 回答
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.
于 2013-03-04T14:14:35.680 回答