Как заменить список ListView новым списком - PullRequest
0 голосов
/ 20 июня 2019

Я часами работаю над ListView, который обновляет изменения ChoiceBox. Итак, я хочу выбрать группу пользователей (у группы пользователей есть имя, отображаемое в поле выбора), и слушатель choicebox получает все имена пользователей из БД, записывает их в новый список и передает их в ListView, который я хочу сейчас менять. Впервые он работает нормально, но я не могу изменить его снова.

Сначала мой ListView был интегрирован в файл FXML, созданный SceneBuilder2.0. Это не сработало. Поэтому я проверил интернет и подумал, что могу создать только новый объект ListView с помощью = new ListView <> (), но это не сработает, когда ListView создан Scenebuilder. Поэтому я создал панель с помощью Scenebuilder, вручную добавил ListView и добавил ее на панель с помощью .getChildren (). Add (listView). Это тоже не сработало или, скажем, я все еще получил тот же результат.

Я попытался отредактировать ArrayList, который находится за ListView, но я прочитал, что я не должен этого делать. Так что я изменил ObservableList, но тоже безуспешно. Так что в настоящее время у меня заканчиваются идеи. В моем коде ниже поле выбора (поле) получило свой собственный список, который работает нормально (потому что мне не нужно его менять). Изменив элемент box, он проверит базу данных для группы игроков, которая теперь должна отображаться в списке. Получение списка из БД работает нормально, но это не изменит ListView. Если я просто сбрасываю ListView с помощью setItems (), я получаю странный вывод. Если я сделаю .clear (), а затем .setItems () у меня возникнет исключение NullpointerException.

Так что я думаю, что может быть проблема с перекраской? Может ли это быть? Спасибо за любую помощь. Теперь это мой последний кусок кода, но я также попробовал несколько других способов заставить его работать.

box.getSelectionModel().selectedIndexProperty().addListener(new ChangeListener<Number>() {
    @Override
    public void changed(ObservableValue<? extends Number> observable, Number oldValue, Number newValue) {
        String selection = box.getItems().get(newValue.intValue());
        GetDataDB dbGet = new GetDataDB();
        playerList = FXCollections.observableArrayList(dbGet.getPlayerListForTourGrpFromDB(selection));
        setPlayerList(playerList);
    }   
});

public void initListPanes() {
    // called at the initialization of the object
    playerListView = new ListView<>();
    playerPane.getChildren().add(playerListView);
}

public void setPlayerList(ObservableList<Player> playerList) {
    playerListView = new ListView<>();
    playerListView.setItems(playerList);
    playerListView.setCellFactory(playerView -> new PlayerListViewCell());
}

1 Ответ

0 голосов
/ 22 июня 2019

Благодаря Slaw, благодаря созданию минимально воспроизводимого примера, мне удалось заставить его работать. Так что, вероятно, что-то не так в логике внутри моего проекта.

Ниже вы можете найти код проекта, который делает именно то, что я хочу: ChoiceBox изменяет список ListView.

    @FXML
    private ListView<String> listView;
    @FXML
    private ChoiceBox<String> box;
    ObservableList<String> observableListViewList;
    ObservableList<String> observableChoiceBoxList;
    ArrayList<String> maleArrayList;
    ArrayList<String> femaleArrayList;
    ArrayList<String> choiceBoxArrayList;

    public void initLists() {
        // choice box init
        choiceBoxArrayList = new ArrayList<>();
        choiceBoxArrayList.add("Male");
        choiceBoxArrayList.add("Female");
        observableChoiceBoxList = FXCollections.observableArrayList(choiceBoxArrayList);
        box.setItems(observableChoiceBoxList);

        // arrayList for ListView
        maleArrayList = new ArrayList<>();
        maleArrayList.add("Karsten");
        maleArrayList.add("Jochen");
        maleArrayList.add("Bryan");

        femaleArrayList = new ArrayList<>();
        femaleArrayList.add("Ingrid");
        femaleArrayList.add("Mathilda");
        femaleArrayList.add("Christi");

        box.getSelectionModel().selectedIndexProperty().addListener(new ChangeListener<Number>() {
            @Override
            public void changed(ObservableValue<? extends Number> observable, Number oldValue, Number newValue) {

                String selection = observableChoiceBoxList.get(newValue.intValue());
                if(selection.equals("Male")) {
                    observableListViewList = FXCollections.observableArrayList(maleArrayList);
                    listView.setItems(observableListViewList);
                } else if(selection.equals("Female")) {
                    observableListViewList = FXCollections.observableArrayList(femaleArrayList);
                    listView.setItems(observableListViewList);
                }
            }
        });
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...