2017-06-09 55 views
1

在vaadin7,我用GeneratedPropertyContainer要做到这一点,例如,增加行数:动态记录内容添加到vaadin电网

 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,不管我如何对行进行排序。

谢谢。

+0

你使用哪个数据提供者/数据源? –

回答

2

不幸的是,据我所知,没有简单的解决方案。但是,你可以像下面的代码:

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行索引。