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を使用する場合、ページ付けと並べ替えの両方がサーバー側で実行されるようになっています。AsyncDataProviderを使用するには、AsyncHandlerが必要です。

    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のサーブレット実装が並べ替えとページ付けを実行します。個別のイベントハンドラーを使用すると、全体を追跡するのがはるかに簡単になります。

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