Working on a Vaadin Flow v24.9.5 and I use a VirtualList to display some data with a lazy loading data provider. Suffering with displaying some empty rows when refreshing the data provider (filtering), when removing equals/hashCode methodes from MyEntity I’m getting duplicates instead of the empty rows.
Data provider:
VirtualList<MyEntity> list = new VirtualList<>();
CallbackDataProvider<MyEntity, MyEntityFilter> provider =
DataProvider.fromFilteringCallbacks(
// fetch callback
(Query<MyEntity, MyEntityFilter> query) -> {
MyEntityFilter filter = query.getFilter().orElse(null);
Pageable pageable = PageRequest.of(query.getPage(), query.getPageSize(), VaadinSpringDataHelpers.toSpringDataSort(query).and(defaultSort));
Page<MyEntity> pageResult = myEntityService.findByFilter(filter, pageable);
return pageResult.stream();
},
// count callback
(Query<MyEntity, MyEntityFilter> query) -> {
MyEntityFilter filter = query.getFilter().orElse(null);
long count = myEntityService.countByFilter(filter);
return (int) count;
}
);
ConfigurableFilterDataProvider<MyEntity, Void, MyEntityFilter> filteredProvider = provider.withConfigurableFilter();
list.setDataProvider(filteredProvider);
filteredProvider.setFilter(currentFilter);
With the following renderer:
list.setRenderer(new ComponentRenderer<>(myEntity-> {
Card card = new Card ();
card.setClassName("card ");
card.addThemeVariants(CardVariant.LUMO_ELEVATED);
card.setTitle(new Div(myEntity.getTitle()));
card.add(myEntity.getBody());
return card;
}));
In MyEntity class I override equals/hashCode methods as the following:
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof MyEntity)) return false;
MyEntity that = (MyEntity) o;
Long id = this.getId();
Long thatId = that.getId();
return id != null && id.equals(thatId);
}
@Override
public int hashCode() {
Long id = this.getId();
return (id != null) ? id.hashCode() : System.identityHashCode(this);
}
Filtering action:
search.addClickListener(buttonClickEvent -> {
ConfigurableFilterDataProvider<MyEntity, Void, MyEntityFilter> filter =
(ConfigurableFilterDataProvider<MyEntity, Void, MyEntityFilter>) list.getDataProvider().withConfigurableFilter();
filter.setFilter(currentFilter);
list.getDataProvider().refreshAll();
});