过滤后,获取当前显示在 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 setFilter
或addFilter
…
➥ 如何检测当前向用户显示 数据提供程序中的多少项目?
我注意到了ListDataProvider::size
方法。但是该方法采用 Query
和 SerializablePredicate
。我的多个过滤器已成功应用,我的 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。
在Grid
widget of Vaadin 14, backed by a ListDataProvider
, after applying a filter(s) via a call such as setFilter
或addFilter
…
➥ 如何检测当前向用户显示 数据提供程序中的多少项目?
我注意到了ListDataProvider::size
方法。但是该方法采用 Query
和 SerializablePredicate
。我的多个过滤器已成功应用,我的 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。