Nano Hash - криптовалюты, майнинг, программирование

Установить порядок сортировки по умолчанию для начального заголовка, нажав на таблицу ячеек gwt

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

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

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

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

29.02.2012

Ответы:


1

Column.setDefaultSortAscending(false) это самый простой способ сделать это; пользовательский CellTable не требуется.

25.08.2012
  • Похоже, это было недавно добавлено в API. Спасибо за обновления. 26.08.2012

  • 2

    Я смог расширить 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;
        }
    }
    }
    
    01.03.2012

    3

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

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

    Если вы поймете основное поведение и требования таблиц Cell/Grid, сортировка столбцов станет ясной.

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

    01.03.2012
  • Спасибо за ответ. Я согласен с вами в вашем связанном посте в том, что примеры неадекватно передают возможности и подход, необходимые для взаимодействия с CellTable. Я смог создать подкласс CellTable, чтобы делать то, что хотел. Я опубликую как ответ. 01.03.2012
  • Чтобы помочь людям, которые ищут ответы, вы должны отметить свой ответ как ответ. 02.03.2012
  • Спасибо за совет. Поскольку я новичок, он хочет, чтобы я подождал день, прежде чем я смогу его отметить. 02.03.2012

  • 4

    вместо

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

    использовать

    someTable.getColumnSortList().push(new ColumnSortInfo(provider.getDefaultSortColumn(), false));
    
    06.12.2012
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..