2016-01-13 3 views
0

Я должен отображать 5000 узлов, используя ListView. Каждый узел содержит сложные элементы управления, но только часть текста отличается в узлах. Как я могу повторно использовать существующие элементы управления узлами для воссоздания своих ячеек при прокруткеВиртуализированные элементы управления JavaFX используют

+0

Какие ячейки? Вы используете TableView? – VGR

+1

Если только текст отличается, то ваш тип данных для 'ListView' должен быть' String', а 'items' для представления списка должен содержать только 5000 строк. Затем используйте фабрику ячеек, чтобы настроить отображение. Трудно ответить на ваш вопрос, кроме этого, без каких-либо подробностей и некоторого кода: вы можете захотеть [изменить] свой вопрос, чтобы предоставить это. –

ответ

0

Ответ James_D указывает на правильное направление. Как правило, в JavaFX вам не стоит беспокоиться о повторном использовании существующих узлов - инфраструктура JavaFX делает именно это, из коробки. Если вы хотите реализовать некоторый рендеринг пользовательских ячеек, необходимо установить мобильный завод, и это обычно выглядит следующим образом:

listView.setCellFactory(new Callback() { 
    @Override 
    public Object call(Object param) { 
    return new ListCell<String>() { 

     // you may declare fields for some more nodes here 
     // and initialize them in an anonymous constructor 

     @Override 
     protected void updateItem(String item, boolean empty) { 
     super.updateItem(item, empty); // Default behaviour: zebra pattern etc. 

     if (empty || item == null) { // Default technique: take care of empty rows!!! 
      this.setText(null); 

     } else { 
      this.setText("this is the content: " + item); 
      // ... do your custom rendering! 
     } 
     } 

    }; 
    } 
}); 

Пожалуйста, обратите внимание: это должно работать, но это лишь иллюстративное - мы Java Devs знают, что, например, , мы использовали бы StringBuilder для конкатенации String, особенно в тех случаях, когда код будет выполняться очень часто. Если вам нужен сложный рендеринг, вы можете создать этот рисунок с дополнительными узлами и установить их как свойство графики с помощью setGraphic(). Это работает аналогично методу Label:

// another illustrative cell renderer: 
listView.setCellFactory(new Callback() { 
    @Override 
    public Object call(Object param) { 
    return new ListCell<Integer>() { 

     Label l = new Label("X"); 

     @Override 
     protected void updateItem(Integer item, boolean empty) { 
     super.updateItem(item, empty); 

     if (empty || item == null) { 
      this.setGraphic(null); 

     } else { 
      this.setGraphic(l); 
      l.setBackground(
        new Background(
          new BackgroundFill(
            Color.rgb(3 * item, 2 * item, item), 
            CornerRadii.EMPTY, 
            Insets.EMPTY))); 
      l.setPrefHeight(item); 
      l.setMinHeight(item); 
     } 
     } 

    }; 
    } 
}); 
+0

Во втором коде мы создаем и уничтожаем контроль над метками всякий раз, когда прокручиваем или изменяем элементы. Есть ли способ кэшировать этот элемент управления для повторного использования? –

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