我想将网格中的一些数据延迟加载到我的 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/