2016-10-25 1 views
1
  1. Загрузите список со списком (a).
  2. В ответ на изменение переключения я переключу содержимое списка в другой список (b). Если список (a) длиннее списка (b), то избыточные элементы остаются отображаемыми в списке, даже если они больше не могут быть выбраны.

Например, buyList = {'100532', '100533'} и saleList = {'100000'}. Если я начну с выбора radioBuy, в списке появятся «100532» и «100533». Переключение переключателя с radioBuy на radioSale приведет к отображению списка «100000» и «100533». «100533» не выбирается, но остается видимым.После наблюдаемого изменения списка, в списке JavaFX8 показывается часть старого списка

Показаны сами наблюдаемые списки и указаны правильные размеры. Просто дисплей ListView показывает старые данные.

Вещи, которые я пробовал:
1. ticketListView.getItems().clear(), а затем перестроить новый список перед переключением списка.
2. Использование ticketListView.getItems().removeAll(0, ticketListView.getItems().size()) 3. Использование цикла для удаления каждого элемента отдельно. 4. Использование ticketListView.refresh() в сочетании со всеми перечисленными выше.

Мой тумблер ChangeListener:

typeGroup.selectedToggleProperty().addListener(new ChangeListener<Toggle>() { 
    public void changed(ObservableValue<? extends Toggle> observable, Toggle oldValue, Toggle newValue) { 
      if (typeGroup.getSelectedToggle().equals(radioBuy)) 
       ticketListView.setItems(buyList); 
      if (typeGroup.getSelectedToggle().equals(radioTransfer)) 
       ticketListView.setItems(transList); 
      if (typeGroup.getSelectedToggle().equals(radioSale)) 
       ticketListView.setItems(saleList); 
     } 
    }); 

Как мне получить ListView самой заготовки, прежде чем он переключает содержание?

+0

Есть ли у вашего списка список пользовательских сотовых фабрик? Если да, включите его в вопрос. –

+0

Нет фабрики ячеек. Я просто изменил метод toString объектов, содержащихся в списке, поэтому список можно считать списком строк. –

+0

ОК, поэтому моя первая догадка неверна. Я никогда не видел такого поведения: ожидаемое поведение заключается в том, что просто вызвать 'setItems (...)' достаточно, чтобы полностью обновить представление списка. Я рекомендую вам создать [MCVE] и [изменить] ваш вопрос, чтобы включить его. –

ответ

1

Извините, что тратило время на все. Оказывается, я действительно с помощью пользовательских фабрики ячеек:

ticketListView.setCellFactory(new Callback<ListView<Header>, 
              ListCell<Header>>() { 
             public ListCell<Header> call(ListView<Header> headerListView) { 
              return new ListCell<Header>() { 
               @Override 
               protected void updateItem(Header item, boolean empty) { 
                super.updateItem(item, empty); 
                if (item != null) { 
                 setText(item.getTicket()); 
                } 
               } 
              }; 
             } 
            } 
    ); 

Удаление этого кода и делать, как я уже говорил ранее, перекрывая ToString, решить эту проблему. Очевидно, мне нужно изучать клеточные фабрики немного больше ...

+0

Или просто исправьте фабрику ячеек в соответствии с [документацией] (http://docs.oracle.com/javase/8/javafx/api/javafx/scene/control/Cell.html#updateItem-T- boolean-) –

Смежные вопросы