我想将网格中的一些数据延迟加载到我的 Vaadin 视图中。网格行有时非常大,所以我想限制一次加载的行数,比如说 2。
我尝试使用DataProvider.fromCallbacks()
. 不幸的是,我没有得到我想要的结果,而且我对传递给该方法的两个函数有点困惑。
据我正确理解,传递的第一个函数描述了如何获取项目,第二个函数告诉 DataProvider 可以获取的最大可能数量的项目。
fromCallbacks(CallbackDataProvider.FetchCallback fetchCallback, CallbackDataProvider.CountCallback countCallback) 创建一个新的数据提供者,它使用回调从任何后备存储中获取和计算项目。
我尝试了以下方法,但它总是会导致获取很多项目。(列表中的 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
我必须调用Query 对象的getOffset()
and getLimit()
,否则会引发异常。如果我理解正确,那么限制会告诉应该获取多少个项目(在我的情况下目标是 2)但是对象是不可变的,所以我不能更改这个值(查询 API)?
tl;博士我如何告诉 DataProvider 一次只获取我的网格的 2 项?
编辑:我发现了与我的问题相关的 github 问题(#6072,#3830)
编辑 2:合并了一个 github 问题,因此更清楚 getLimit() 方法的工作原理:https ://github.com/vaadin/flow/issues/6996