GWT - сортируемая колонка CellTable не будет реагировать на клики - PullRequest
0 голосов
/ 31 мая 2018

У меня есть столбец GWT Celltable, который нужно отсортировать по алфавиту.Я следовал официальной документации и другим вопросам, размещенным здесь , но я не смог заставить его работать.

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

Что я делаю не так?Мой запутанный код -

public class MyClass extends Composite {
    //other fields
    private static MyUiBinder uiBinder = GWT.create(MyUiBinder.class);
    @UiField CellTable<MyObject> myTable = new CellTable<MyObject>();
    final ListDataProvider<MyObject> myDataProvider = new ListDataProvider<MyObject>();

    @UiConstructor
    public MyClass(...) {
        initWidget(uiBinder.createAndBindUi(this));
        // other initialization
        buildMyTable();
    }

    buildMyTable() {
        myDataProvider.addDataDisplay(myTable);

        Column<MyObject, String> colA = new Column<MyObject, String>(new TextCell()) {

            @Override
            public String getValue(MyObject object) {
                return object.getName();
            }
        };

        Column<MyObject, String> colB = new Column<MyObject, String>(new TextCell()) {

            @Override
            public String getValue(MyObject object) {
                return object.getAddress();
            }
        };

        // created other columns

        colA.setSortable(true);

        myTable.addColumn(colA, "COL A");
        myTable.addColumn(colB, "COL B");
        // added other columns to the table

        ListHandler<MyObject> columnSortHandler = new ListHandler<>(myDataProvider.getList());
        columnSortHandler.setComparator(colA, new Comparator<MyObject>() {

            @Override
            public int compare(MyObject o1, MyObject o2) {
                if (o1 == o2) {
                    return 0;
                }

                if (o1 != null) {
                    return (o2 != null) ? o1.getName.compareTo(o2.getName) : 1;
                }
                return -1;
            }
        });

        myTable.addColumnSortHandler(columnSortHandler);
        myTable.getColumnSortList().push(colA);
        ColumnSortEvent.fire(myTable, myTable.getColumnSortList());
    }
}

1 Ответ

0 голосов
/ 31 мая 2018

Это все о том, как вы добавляете данные в CellTable.Например, вы можете

myDataProvider.setList(rowData);

или

myTable.setRowData(rowData);

, но оба вышеуказанных метода не позволят отсортировать данные.Это потому, что у вас уже есть ListHandler, определенный с пустым списком.И он не заметит, что список изменился, поэтому сортировка не будет выполняться.

См. ListDataProvider документация :

Модификации (вставляет, удаляет), устанавливает и т. д.) в список, возвращаемый getList (), будет отражено в модели.Однако мутации в элементах, содержащихся в списке, НЕ будут отражены в модели.Вы должны вызвать List.set (int, Object), чтобы обновить элемент в списке и отправить изменение на экран, или вызвать refresh (), чтобы вывести все строки на экран.List.set (int, Object) работает лучше, поскольку позволяет поставщику данных выдвигать только те строки, которые были изменены, и обычно позволяет дисплею повторно отображать только подмножество строк.

Итак, вы должны сначала getList() и изменить его следующим образом:

myDataProvider.getList().clear();
myDataProvider.getList().addAll(rowData);
...