java - 如何设置 DataProvider 从后端获取的元素数量?

标签 java vaadin vaadin14

我想将网格中的一些数据延迟加载到我的 Vaadin View 中。网格行有时非常大,所以我想限制一次加载的行数,假设为 2。

我尝试使用 DataProvider.fromCallbacks() 来做到这一点.不幸的是,我没有得到我想要的结果,我对传递给方法的两个函数有点困惑。

据我正确理解,传递的第一个函数描述了如何获取项目,第二个函数告诉 DataProvider 可以获取的最大可能项目数量。

fromCallbacks(CallbackDataProvider.FetchCallback fetchCallback, CallbackDataProvider.CountCallback countCallback) Creates a new data provider that uses callbacks for fetching and counting items from any backing store.



我尝试了以下操作,但它总是导致获取了很多项目。 (列表中的 17 个项目导致获取 17 个项目,列表中的 120 个项目导致 50 个批次)
    List<SomeObject> data = ... // filled with objects

    DataProvider<CustromCell, Void> lazyLoadingProvider
            = DataProvider.fromCallbacks(
                    query -> {
                        int offset = query.getOffset();
                        int limit = query.getLimit(); // Is this the amount of items that are fetched in one step?

                        if (offset + limit > data.size()) 
                            return data.stream();

                        List<CustromCell> cells = data.subList(offset,offset+limit); 
                                                                 //(offest,offset+2) crashes
                        return cells.stream()
                    },
                    query -> data.size() // Max possible items to fetch
            );
            grid.setDataProvider(lazyLoadingProvider);

具有以下行为:
Size Of Data: 219
Offset: 0
Limit: 50

Size Of Data: 219
Offset: 50
Limit: 50

Size Of Data: 219
Offset: 100
Limit: 50

Size Of Data: 219
Offset: 150
Limit: 50

Size Of Data: 219
Offset: 200
Limit: 19

我要打电话getOffset()getLimit() Query 对象,否则抛出异常。如果我理解正确,那么限制会告诉我们应该获取多少个项目(在我的例子中目标是 2)但是对象是不可变的,所以我不能改变这个值( Query API )?

tl;博士 如何告诉 DataProvider 一次只获取网格的 2 个项目?

编辑 :我发现了与我的问题相关的 github 问题( #6072#3830 )

编辑 2 :合并了一个 github 问题,因此 getLimit() 方法的工作原理更加清晰:https://github.com/vaadin/flow/issues/6996

最佳答案

我能够为此找到解决方案。
query.getLimit()方法取决于组件的(所以网格的)页面大小。

引用 Grid API :

Grid()

Creates a new instance, with page size of 50.



我的网格是这样初始化的:Grid a = new Grid();这导致页面大小为 50。query.getLimit()在这种情况下将返回 50。

Grid(int pageSize)

Creates a new instance, with the specified page size.



像这样初始化网格:Grid a = new Grid(5); . query.getLimit()在这种情况下现在将返回 5 和 DataProvider将只获取接下来的 5 个元素。

编辑 :关于此 SO 问题的 github 问题已合并:https://github.com/vaadin/flow/issues/6996

关于java - 如何设置 DataProvider 从后端获取的元素数量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58974364/

相关文章:

java - 删除文件第一行/顶行的最快 Java 方法(如堆栈)

java - SonarQube 与 Apache Commons Lang3 中的 Validate 类

java - 使用 css 在 Vaadin 中设置样式

java - 如何在 Vaadin 的另一个类中使用路由器布局类的变量/方法?

java - Java 中具有过期时间的对象池的第三方库

java - 检查私有(private)静态内部类的实例

java - @PropertyId注释 "is disallowed for this location"

java - 从 String 转换为 int 再转换为 Vaadin 时出错

spring - 生成水平布局中嵌套的网格,但未完全显示

java - AppLayout 中如何将 Component ranged right 添加到 Navbar?