如何设置数据提供者将从后端获取的元素数量?

时间:2019-11-21 11:51:02

标签: java vaadin vaadin14

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

2 个答案:

答案 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中显示的结果数不受限制,您将具有以下行为:

  1. 获取前5个(页面大小设置)元素
  2. 发现您可以在UI上显示更多元素,因此在数据提供者上触发第二次获取
  3. 从偏移量5提取到限制34

我发现这种结合根本没有记载。