Uploaded image for project: 'JDK'
  1. JDK
  2. JDK-8088467

ListView: selectedIndices/-items must not fire on reselect selected

XMLWordPrintable

      While doing regression testing (of my own implementations) against the fix of RT-37360, I noticed that ListView's selectionModel fires list changes for selectedIndices/items on select(selectedIndex). As nothing changed, it must not do so, IMO. TableView is behaving as expected. Failing tests below.

          /**
           * Issue: ListView must not fire on re-select already selected.
           */
          @Test
          public void testSelectedIndicesReselect() {
              ListView<String> stringListView = new ListView<>();
              stringListView.getItems().addAll("a", "b");
              
              MultipleSelectionModel<String> sm = stringListView.getSelectionModel();
              sm.setSelectionMode(SelectionMode.MULTIPLE);
              IntegerProperty counter = new SimpleIntegerProperty();
              sm.selectAll();
              String selected = sm.getSelectedItem();
              int selectedIndex = sm.getSelectedIndex();
              List<String> selectedItems = new ArrayList(sm.getSelectedItems());
              List<Integer> selectedIndices = new ArrayList(sm.getSelectedIndices());
              sm.getSelectedIndices().addListener((ListChangeListener<Integer>) c -> {
                  counter.set(counter.get() +1);
              });
              // add selectedIndex - changes nothing as it is already selected
              sm.select(selectedIndex);
              assertSame("sanity: state unchanged", selected, sm.getSelectedItems().get(1));
              assertEquals("sanity: state unchanged", 1, selectedIndex);
              assertEquals("sanity: state unchanged", selectedItems, sm.getSelectedItems());
              assertEquals("sanity: state unchanged", selectedIndices, sm.getSelectedIndices());
              assertEquals("must not fire if nothing changed", 0, counter.get());
          }
          
          @Test
          public void testSelectedItemsReselect() {
              ListView<String> stringListView = new ListView<>();
              stringListView.getItems().addAll("a", "b");
              
              MultipleSelectionModel<String> sm = stringListView.getSelectionModel();
              sm.setSelectionMode(SelectionMode.MULTIPLE);
              IntegerProperty counter = new SimpleIntegerProperty();
              sm.selectAll();
              String selected = sm.getSelectedItem();
              int selectedIndex = sm.getSelectedIndex();
              List<String> selectedItems = new ArrayList(sm.getSelectedItems());
              List<Integer> selectedIndices = new ArrayList(sm.getSelectedIndices());
              sm.getSelectedItems().addListener((ListChangeListener<String>) c -> {
                  counter.set(counter.get() +1);
              });
              // add selectedIndex - changes nothing as it is already selected
              sm.select(selectedIndex);
              assertSame("sanity: state unchanged", selected, sm.getSelectedItems().get(1));
              assertEquals("sanity: state unchanged", 1, selectedIndex);
              assertEquals("sanity: state unchanged", selectedItems, sm.getSelectedItems());
              assertEquals("sanity: state unchanged", selectedIndices, sm.getSelectedIndices());
              assertEquals("must not fire if nothing changed", 0, counter.get());
          }

            jgiles Jonathan Giles
            fastegal Jeanette Winzenburg
            Votes:
            0 Vote for this issue
            Watchers:
            3 Start watching this issue

              Created:
              Updated:
              Resolved:
              Imported: