GWT - сортируемый столбец CellTable не будет реагировать на клики

У меня есть столбец 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());
    }
}

person Anish Sana    schedule 30.05.2018    source источник


Ответы (1)


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

myDataProvider.setList(rowData);

or

myTable.setRowData(rowData);

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

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

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

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

myDataProvider.getList().clear();
myDataProvider.getList().addAll(rowData);
person Adam    schedule 31.05.2018