добавить динамическое содержимое строки в сетку vaadin

В vaadin7 я использовал для этого GeneratedPropertyContainer, например, добавляя номер строки:

        wrappedContainer = new GeneratedPropertyContainer(_container);
        wrappedContainer.addGeneratedProperty("#", 
                new PropertyValueGenerator<Integer>() {

                    @Override
                    public Integer getValue(Item item, Object itemId, Object propertyId) {
                        return (int) _container.indexOfId(itemId) + 1;
                    }

                    @Override
                    public Class<Integer> getType() {
                        return java.lang.Integer.class;
                    }
                }
        );

        setContainerDataSource(wrappedContainer);

В vaadin8, поскольку GeneratedPropertyContainer устарел, я пытался сделать вот так: grid.addColumn((v)->((List)_container.getData().getItems()).indexOf(v)+1);

Но индекс статичен, когда я сортирую строки по возрастанию и убыванию, номер строки тоже перемещается.

Мне нужна первая строка с номером 1, а последняя строка с номером N, независимо от того, как я сортирую строки.

Спасибо.


person William Anthony    schedule 09.06.2017    source источник
comment
Какой поставщик данных / источник данных вы используете?   -  person Steffen Harbich    schedule 11.06.2017


Ответы (1)


К сожалению, насколько я могу судить, простого решения «из коробки» не существует. Однако вы можете сделать следующий код:

Grid<MyBean> grid = new Grid<>();
grid.setDataProvider(new RowIndexDataProviderWrapper<>(DataProvider.ofItems(new MyBean("Item 1"), new MyBean("Item 2"), new MyBean("Item 3"))));
grid.addColumn(MyBean::getRowIndex).setCaption("#");
grid.addColumn(MyBean::getName).setCaption("Name");

public interface RowIndexAware {
    void setRowIndex(int rowIndex);
    int getRowIndex();
}

public class MyBean implements RowIndexAware {
    // implement the interface (e.g. store row index in field)
    // and add your bean properties
}

public class RowIndexDataProviderWrapper<T extends RowIndexAware, F> implements DataProvider<T, F> {

    private DataProvider<T, F> wrapped;

    public RowIndexDataProviderWrapper(DataProvider<T, F> wrapped) {
        this.wrapped = wrapped;
    }

    // delegate all methods to be implemented for DataProvider interface
    // to wrapped DataProvider with the exception of "fetch":

    @Override
    public Stream<T> fetch(Query<T, F> query) {
        List<T> result = wrapped.fetch(query).collect(Collectors.toCollection(ArrayList::new));
        for (int i = 0; i < result.size(); i++) {
            result.get(i).setRowIndex(query.getOffset() + i);
        }
        return result.stream();
    }

}

Идея состоит в том, чтобы получить индекс строки, когда строки выбираются в DataProvider, и сохранить их в вашем bean-компоненте.

person Steffen Harbich    schedule 11.06.2017