【问题标题】:Gwt Simple pager issues with a column sort handler列排序处理程序的 Gwt 简单寻呼机问题
【发布时间】:2013-03-04 08:00:05
【问题描述】:

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

如何在单击列标题时更新数据?

这是我的代码 sn-p

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

【问题讨论】:

    标签: gwt sorting gwt-celltable simplepager


    【解决方案1】:

    使用 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 实现执行排序和分页。使用单独的事件处理程序更容易理解整个事情。

    【讨论】:

    • 有趣的是,我的排序问题是由于双重用途 onRangedChanged 而不是覆盖 AsynchHandler.onColumnSort,那么您需要的一切都来自事件,并且您避免触发 setVisibleRangeAndClearData...我稍后会更新代码
    • 感谢您的解释。
    • 没问题,我只是更新了代码以反映 onColumnSort 事件处理。
    【解决方案2】:

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

    【讨论】:

    • 为此,我从同一个列表中传递子列表。我应该做出什么改变?
    • 将您的 ListHander 初始化和 cellTable.addColumnSortHandler 方法调用移动到 onRangeChange 方法调用 updateRowData 方法后,将子列表作为 ListHandler 的参数。
    • 这也不起作用,即使在 onRangeChange 方法中添加处理程序后,我也会得到完全相同的行为。
    猜你喜欢
    • 2011-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-07
    • 2011-06-13
    • 1970-01-01
    • 2011-03-09
    • 1970-01-01
    相关资源
    最近更新 更多