From b7af23d8dc9529aaf7b80e417725a6d43dc69b7e Mon Sep 17 00:00:00 2001 From: Teemu Suo-Anttila Date: Mon, 14 Dec 2015 10:40:06 +0200 Subject: Fix RpcDataProvider listener handling on ItemSetChange (#19371) Old ValueChangeListeners are discarded and new ones created when an ItemSetChange occurs. This is done to reapply the listeners to possibly recreated Items. Change-Id: I9956af8950e241005574c597c49c5efb43afc1c7 --- .../server/communication/data/RpcDataProviderExtension.java | 11 +++++++++++ 1 file changed, 11 insertions(+) (limited to 'server') diff --git a/server/src/com/vaadin/server/communication/data/RpcDataProviderExtension.java b/server/src/com/vaadin/server/communication/data/RpcDataProviderExtension.java index 55b486d4b6..1b78ca4518 100644 --- a/server/src/com/vaadin/server/communication/data/RpcDataProviderExtension.java +++ b/server/src/com/vaadin/server/communication/data/RpcDataProviderExtension.java @@ -137,6 +137,10 @@ public class RpcDataProviderExtension extends AbstractExtension { @Override public void destroyData(Object itemId) { keyMapper.remove(itemId); + removeListener(itemId); + } + + private void removeListener(Object itemId) { GridValueChangeListener removed = activeItemMap.remove(itemId); if (removed != null) { @@ -239,6 +243,13 @@ public class RpcDataProviderExtension extends AbstractExtension { } else { + // Remove obsolete value change listeners. + Set keySet = new HashSet( + activeItemHandler.activeItemMap.keySet()); + for (Object itemId : keySet) { + activeItemHandler.removeListener(itemId); + } + /* Mark as dirty to push changes in beforeClientResponse */ bareItemSetTriggeredSizeChange = true; markAsDirty(); -- cgit v1.2.3