GWT - Как отсортировать столбец таблицы ячеек?

Я читаю о том, как добавить функции сортировки столбцов в таблицу ячеек, но я не понимаю код, предоставленный Google. Ниже приведена моя таблица ячеек. Как мне добавить возможность сортировки nameColumn?

public class CellTableExample implements EntryPoint {

    private static class Contact {
        private String address; 
        private String name;

        public Contact(String name, String address) {
            super();
            this.address = address; 
            this.name = name; 
        } 
    }

    // The list of data to display.
      private static List<Contact> CONTACTS = Arrays.asList(
        new Contact("John", "123 Fourth Road asdf asdf asdfasdf"),
        new Contact("Mary", "222 Lancer Lane")

      );

    @Override
    public void onModuleLoad() {
        CellTable<Contact> table = new CellTable<Contact>(); 

        //address column
        TextColumn<Contact> addressColumn = new TextColumn<Contact>(){
            @Override
            public String getValue(Contact contact) {
                return contact.address;
            }
        };

        //name column
        TextColumn<Contact> nameColumn = new TextColumn<Contact>(){
            @Override
            public String getValue(Contact contact) {
                return contact.name;
            }
        };

        // Add the columns.
        table.addColumn(nameColumn, "Name");
        table.addColumn(addressColumn, "Address");

        table.setRowCount(CONTACTS.size(), true);
        table.setRowData(0, CONTACTS);

        RootPanel.get().add(table); 
    }

}

person sap    schedule 11.08.2011    source источник


Ответы (2)


Я полагаю, вы имеете в виду Руководство разработчика — Таблица ячеек . Если у вас запущен первый пример, вы можете сделать столбец имени сортируемым (добавить маленькую стрелку к имени) с помощью

table.getColumn(0).setSortable(true);

Кстати, это коды, которые я должен был добавить, чтобы запустить ваш пример (просто скопируйте его после "RootPanel.get().add(table);" и замените "_01_scheduleDeferred" на имя вашего проекта)

    // Create a data provider.
    ListDataProvider<Contact> dataProvider = new ListDataProvider<Contact>();

    // Connect the table to the data provider.
    dataProvider.addDataDisplay(table);

    // Add the data to the data provider, which automatically pushes it to the
    // widget.
    List<Contact> list = dataProvider.getList();
    for (Contact contact : CONTACTS) {
      list.add(contact);
    }

    // Add a ColumnSortEvent.ListHandler to connect sorting to the
    // java.util.List.
    ListHandler<Contact> columnSortHandler = new ListHandler<_01_scheduleDeferred.Contact>(
        list);
    columnSortHandler.setComparator(nameColumn,
        new Comparator<_01_scheduleDeferred.Contact>() {
        @Override
        public int compare(_01_scheduleDeferred.Contact o1, _01_scheduleDeferred.Contact o2) {
            if (o1 == o2) {
                  return 0;
                }

                // Compare the name columns.
                if (o1 != null) {
                  return (o2 != null) ? o1.name.compareTo(o2.name) : 1;
                }
                return -1;
        }
        });
    table.addColumnSortHandler(columnSortHandler);

    // We know that the data is sorted alphabetically by default.
    table.getColumnSortList().push(nameColumn);
person Stefan    schedule 11.08.2011
comment
Я не понял важности замены _01_scheduleDeffered на имя проекта. Каково его использование и можем ли мы дать ему любое число. - person Ashish; 24.01.2014
comment
_01_scheduleDeffered было именем моего проекта в то время. Вы можете заменить его на путь к вашему классу - person Stefan; 24.01.2014

Я написал класс утилиты для инкапсуляции добавления сортируемого TextColumn в CellTable, что упростит задачу. Я уверен, что он будет развиваться в течение следующих нескольких дней, но вот то, над чем я работал до сих пор...

package your.package.here;

import com.google.gwt.user.cellview.client.CellTable;
import com.google.gwt.user.cellview.client.ColumnSortEvent;
import com.google.gwt.user.cellview.client.TextColumn;
import com.google.gwt.view.client.ListDataProvider;

import java.util.Comparator;

/**
 * Created by alex on 8/3/16.
 */
public class CellTableUtil
{
    public static <D> void addSortableTextColumn(CellTable<D> table, ListDataProvider<D> dataProvider,
                                       String columnTitle, final FieldExtractor<D, String> fieldExtractor)
    {
        final TextColumn<D> col = new TextColumn<D>()
        {
            @Override
            public String getValue(D client)
            {
                return String.valueOf(fieldExtractor.getField(client));
            }
        };
        col.setSortable(true);
        table.addColumn(col, columnTitle);

        ColumnSortEvent.ListHandler<D> columnSortHandler = new ColumnSortEvent.ListHandler<>(
                dataProvider.getList());
        columnSortHandler.setComparator(col,
                new Comparator<D>() {
                    public int compare(D o1, D o2) {
                        if (o1 == o2) {
                            return 0;
                        }

                        // Compare the fields of the Client
                        if (o1 != null) {
                            return (o2 != null) ?
                                    fieldExtractor.getField(o1).compareTo(fieldExtractor.getField(o2)) : 1;
                        }
                        return -1;
                    }
                });
        table.addColumnSortHandler(columnSortHandler);
    }

    /**
     * Created by alex on 8/3/16.
     */
    public static interface FieldExtractor<D, T>
    {
        public T getField(D dataEntity);
    }
}

В моем коде тип данных, который я перечисляю в таблице, называется «Клиент», в котором есть метод getFirstName(). Теперь вы можете вызвать этот метод, чтобы добавить в таблицу сортируемый столбец, например...

CellTableUtil.addSortableTextColumn(table, dataProvider, "First Name",
                new CellTableUtil.FieldExtractor<Client, String>() {
            @Override
            public String getField(Client c)
            {
                return c.getFirstName();
            }
        });
person Alex Worden    schedule 04.08.2016