我想将网格中的某些数据延迟加载到我的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()
和getLimit()
,否则会引发异常。如果我正确理解它,那么该限制会告诉您应该提取多少个项目(在我的情况下,目标是2),但是该对象是不可变的,因此我无法更改此值(Query API)?
tl; dr 如何告诉DataProvider一次仅获取网格中的2个项目?
编辑:我发现与我的问题(#6072,#3830)相关的github问题
编辑2 :合并了github问题,因此更清楚了getLimit()方法的工作方式:https://github.com/vaadin/flow/issues/6996
答案 0 :(得分:2)
我能够找到解决方案。
query.getLimit()
方法取决于其网格的页面大小。
引用Grid API:
Grid()
创建一个新实例,页面大小为50。
我的网格初始化如下:Grid a = new Grid();
导致页面大小为50。在这种情况下,query.getLimit()
将返回50。
Grid(int pageSize)
创建具有指定页面大小的新实例。
像这样初始化网格:Grid a = new Grid(5);
。在这种情况下,query.getLimit()
现在将返回5,而DataProvider
将仅获取接下来的5个元素。
编辑:有关此SO问题的github问题已合并:https://github.com/vaadin/flow/issues/6996
答案 1 :(得分:0)
更确切地说,查询限制取决于2个主要条件:
以及其他2个辅助标准/行为:
您的用户界面中一次可以显示多少个元素。如果您的网格一次可以显示的页面大小超过设置的大小,那么查询限制将根据数据提供者的大小以及我估计的默认页面大小(50)自动调整
由于网格可能会更改查询限制,具体取决于我刚刚解释的内容,如果刷新数据(例如,由于对数据提供者应用了过滤),则限制除非您在刷新数据之前再次专门设置了网格大小,否则它将不再是网格页面大小,例如:
grid.setPageSize(GRID_PAGE_SIZE); grid.getDataProvider().refreshAll();
因此,假设您的数据提供者返回了34个结果,您将页面大小设置为5,并且您的UI中显示的结果数不受限制,您将具有以下行为:
我发现这种结合根本没有记载。