过滤后,获取当前显示在 Vaadin 14 网络应用程序中的网格小部件中的项目数

After filtering, get count of items currently displayed in a Grid widget in Vaadin 14 web app

Grid widget of Vaadin 14, backed by a ListDataProvider, after applying a filter(s) via a call such as setFilteraddFilter

➥ 如何检测当前向用户显示 数据提供程序中的多少项目?

我注意到了ListDataProvider::size方法。但是该方法采用 QuerySerializablePredicate。我的多个过滤器已成功应用,我的 Grid 显示了数据提供者项目的子集。所以我不想 运行 另一个查询。我想知道已经应用过滤器的结果。

这是一个概念证明,其中包含一个缓存大小的自定义 ListDataProvider

在调用 setFilter 时,或者在调用 DataProviderListener 时,计数尚未更新。因此,我们使用 UI.getCurrent().beforeClientResponse(...) 来延迟文本的更新。

public class MainView extends VerticalLayout {

    public MainView() {
        Grid<String> grid = new Grid<>();
        grid.addColumn(String::toString).setHeader("Value");

        MyDataProvider<String> myDataProvider = new MyDataProvider<>(
                Arrays.asList("One", "Two", "Three", "Four", "Five"));
        grid.setDataProvider(myDataProvider);

        Span countSpan = new Span();

        TextField filterField = new TextField("Filter");
        filterField.addValueChangeListener(e ->
                myDataProvider.setFilter(str -> str.contains(e.getValue())));

        // Use beforeClientResponse to give the grid time to filter the results
        myDataProvider.addDataProviderListener(e ->
                UI.getCurrent().beforeClientResponse(this, context ->
                        countSpan.setText(myDataProvider.getCachedSize() + " items in the grid")));

        add(filterField, grid, countSpan);
    }

    private static class MyDataProvider<T> extends ListDataProvider<T> {

        private int cachedSize;

        public MyDataProvider(Collection<T> items) {
            super(items);
        }

        @Override
        public int size(Query<T, SerializablePredicate<T>> query) {
            return (cachedSize = super.size(query));
        }

        public int getCachedSize() {
            return cachedSize;
        }
    }
}

new Query<>( myDataProvider.getFilter() )传递给ListDataProvider::size

ListDataProvider 有方法 size(Query<T, SerializablePredicate<T>> query)

因为数据提供者只保留原始项目列表,所以没有参数的简单 size 方法将无法如您所愿地工作。您可以使用数据提供者的当前过滤器构建所需的查询。

我测试了以下代码并且它有效:

// my own method, defined as value change listeners of any filter field
private void onFilterChange(){
    ListDataProvider<Foo> dataProvider = (ListDataProvider<Foo>) grid.getDataProvider();
    dataProvider.setFilter((item) -> {......}

    // everytime after resetting the filter, check how many items now are displayed
    int filteredSize = dataProvider.size(new Query<>(dataProvider.getFilter()));

    int fullSize = dataProvider.getItems().size(); // this is how you get the size of all items
    Notification.show(String.format("Now showing %d of %d items", filteredSize, fullSize));
}

也许将来这项工作会更容易一些:请参阅功能请求票 Add filteredSize method to DataProvider or ListDataProvider #7539