Установить порядок сортировки по умолчанию для начального заголовка клика по таблице ячеек gwt - PullRequest
7 голосов
/ 29 февраля 2012

У меня есть GWT CellTable с сортируемыми столбцами, очень похожими на пример руководства разработчика (http://code.google.com/webtoolkit/doc/latest/DevGuideUiCellTable.html#columnSorting).

Однако я бы хотел, чтобы некоторые столбцы сортировались по убыванию, а не по возрастанию по умолчанию. То есть, если столбец A в настоящее время не отсортирован, и я щелкаю его заголовок, я хочу, чтобы столбец A сортировался по убыванию при первом щелчке и по возрастанию при втором щелчке. Но я все еще хочу, чтобы другие столбцы сортировались так, как они в настоящее время делают - в порядке возрастания по первому щелчку.

Помимо метода Column.setSortable (boolean) для установки сортируемости и метода ColumnSortList.push (ColumnSortInfo) для ручного запуска сортировки, похоже, не существует большого контроля над процессом.

Есть ли способ достичь этой цели?

Ответы [ 4 ]

7 голосов
/ 26 августа 2012

Column.setDefaultSortAscending(false) - это простой способ сделать это;не требуется CellTable требуется.

5 голосов
/ 01 марта 2012

Мне удалось расширить CellTable, чтобы сделать именно то, что я хотел в основном, переопределив onColumnSort(ColumnSortEvent) метод ListHandler, связанный с таблицей. Это мясо / картофель реализации. Мне пришлось немного позаботиться о том, чтобы отсортировать столбец, когда вы собираетесь снова его отсортировать.

Одна вещь, которая смутила меня (и это было неясно в примерах Google), заключалась в том, что использование метода ColumnSortList.push() на самом деле не вызывает сортировку, как при нажатии, но вместо этого просто меняет базовое состояние того, как колонка думает отсортировано.

Когда я был готов использовать эту таблицу, я сделал следующее:

SortedCellTable<MyRowObject> table = new SortedCellTable<MyRowObject>();
table.addColumn(colOne, "one", true); // sortable column
table.addColumn(colTwo, "two", true); //sortable column
table.addColumn(colThree, "three", false); // unsortable column

table.setDefaultSortOrder(colOne, true); // sorts ascending on first click
table.setDefaultSortOrder(colTwo, false); // sorts descending on first click

table.setInitialSortColumn(colTwo); // sort this column as soon as data is set

table.setComparator(colOne, colOneComp); // use this comparator when sorting colOne
table.setComparator(colTwo, colTwoComp); // use this comparator when sorting colTwo

panel.add(table); // add the table to our view
// ...sometime later, asynchronously...
table.setList(myRowObjectList);

Вот реализация SortedCellTable:

public class SortedCellTable<T> extends CellTable<T> {
/**
 * To keep track of the currently sorted column
 */
private Column<T, ?> currentlySortedColumn;
/**
 * Tells us which way to sort a column initially
 */
private Map<Column<T, ?>, Boolean> defaultSortOrderMap = new HashMap<Column<T, ?>, Boolean>();
/**
 * Comparators associated with their columns
 */
private Map<Column<T, ?>, Comparator<T>> comparators = new HashMap<Column<T, ?>, Comparator<T>>();
/**
 * Column to sort when the data provider's list is refreshed using
 * {@link SortedCellTable#setList(List)}
 */
private Column<T, ?> initialSortColumn;
/**
 * Data provider we will attach to this table
 */
private ListDataProvider<T> dataProvider;
/**
 * Special column sorting handler that will allow us to do more controlled
 * sorting
 */
ListHandler<T> columnSortHandler;

public SortedCellTable() {
    super();
    dataProvider = new ListDataProvider<T>();
    dataProvider.addDataDisplay(this);
    columnSortHandler = new ListHandler<T>(dataProvider.getList()) {

        @Override
        public void onColumnSort(ColumnSortEvent event) {
            @SuppressWarnings("unchecked")
            Column<T, ?> column = (Column<T, ?>) event.getColumn();
            if (column == null) {
                return;
            }

            if (column.equals(currentlySortedColumn)) {
                // Default behavior
                super.onColumnSort(event);
            } else {
                // Initial sort; look up which direction we need
                final Comparator<T> comparator = comparators.get(column);
                if (comparator == null) {
                    return;
                }

                Boolean ascending = defaultSortOrderMap.get(column);
                if (ascending == null || ascending) {
                    // Default behavior
                    super.onColumnSort(event);
                } else {
                    // Sort the column descending
                    Collections.sort(getList(), new Comparator<T>() {
                        public int compare(T o1, T o2) {
                            return -comparator.compare(o1, o2);
                        }
                    });
                    // Set the proper arrow in the header
                    getColumnSortList().push(
                            new ColumnSortInfo(column, false));
                }
                currentlySortedColumn = column;
            }
        }

        @Override
        public void setComparator(Column<T, ?> column,
                Comparator<T> comparator) {
            comparators.put(column, comparator);
            super.setComparator(column, comparator);
        }

    };
    addColumnSortHandler(columnSortHandler);
}

/**
 * Adds a column to the table and sets its sortable state
 * 
 * @param column
 * @param headerName
 * @param sortable
 */
public void addColumn(Column<T, ?> column, String headerName,
        boolean sortable) {
    addColumn(column, headerName);
    column.setSortable(sortable);
    if (sortable) {
        defaultSortOrderMap.put(column, true);
    }
}

/**
 * Adds a column to the table and sets its sortable state
 * 
 * @param column
 * @param header
 * @param sortable
 */
public void addColumn(Column<T, ?> column, Header<?> header,
        boolean sortable) {
    addColumn(column, header);
    column.setSortable(sortable);
    if (sortable) {
        defaultSortOrderMap.put(column, true);
    }
}

/**
 * Sets the column to sort when the data list is reset using
 * {@link SortedCellTable#setList(List)}
 * 
 * @param column
 */
public void setInitialSortColumn(Column<T, ?> column) {
    initialSortColumn = column;
}

/**
 * Sets a comparator to use when sorting the given column
 * 
 * @param column
 * @param comparator
 */
public void setComparator(Column<T, ?> column, Comparator<T> comparator) {
    columnSortHandler.setComparator(column, comparator);
}

/**
 * Sets the sort order to use when this column is clicked and it was not
 * previously sorted
 * 
 * @param column
 * @param ascending
 */
public void setDefaultSortOrder(Column<T, ?> column, boolean ascending) {
    defaultSortOrderMap.put(column, ascending);
}

/**
 * Sets the table's data provider list and sorts the table based on the
 * column given in {@link SortedCellTable#setInitialSortColumn(Column)}
 * 
 * @param list
 */
public void setList(List<T> list) {
    dataProvider.getList().clear();
    if (list != null) {
        for (T t : list) {
            dataProvider.getList().add(t);
        }
    }

    // Do a first-time sort based on which column was set in
    // setInitialSortColumn()
    if (initialSortColumn != null) {
        Collections.sort(dataProvider.getList(), new Comparator<T>() {

            @Override
            public int compare(T o1, T o2) {
                return (defaultSortOrderMap.get(initialSortColumn) ? 1 : -1)
                        * comparators.get(initialSortColumn)
                                .compare(o1, o2);
            }

        });
        // Might as well get the little arrow on the header to make it
        // official
        getColumnSortList().push(
                new ColumnSortInfo(initialSortColumn, defaultSortOrderMap
                        .get(initialSortColumn)));
        currentlySortedColumn = initialSortColumn;
    }
}
}
2 голосов
/ 01 марта 2012

Посмотрите на GWT CellTable столбцы сортировки . (Кто-то проголосовал за это, потому что он / она не согласился с моим подходом?)

Это не ответ на ваш вопрос, но он предлагает вам ознакомиться с основами Celltable, прежде чем пытаться что-либо проиллюстрировать примерами из Celltable.

Если разобраться в базовом поведении и требованиях таблиц Cell / Grid, сортировка столбцов проявится четко.

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

1 голос
/ 06 декабря 2012

вместо

someTable.getColumnSortList().push(provider.getDefaultSortColumn());

используйте

someTable.getColumnSortList().push(new ColumnSortInfo(provider.getDefaultSortColumn(), false));
...