首页 > 解决方案 > 我在 ListView 中设置项目后,ListView 中的项目消失 - Java

问题描述

第一次使用堆栈溢出。我对 JavaFx 很陌生。我的项目中有一个 ListView 来显示所有Post项目。有三种 Post ,分别是EventSaleJob。当我尝试使用ChoiceBox过滤帖子并显示不同类型的帖子时。我发现它在前几次运行中运行良好。在我更改选择框服务时间后,项目消失,但我仍然可以在 ListView 上选择项目。打印后发现 FilteredList 是正确的。看起来 ListView 上的项目加载得不是很好。

这是初始化设置的代码

postInfoObservableList = FXCollections.observableArrayList(UniLinkDatabase.getPosts().values());

        //set choice box items
        typeChoiceBox.getItems().addAll("All", "Event", "Sale", "Job");
        typeChoiceBox.setValue("All");
        statusChoiceBox.getItems().addAll("All", "Open", "Closed");
        statusChoiceBox.setValue("All");
        creatorChoiceBox.getItems().addAll("All", "My Post");
        creatorChoiceBox.setValue("All");

        //set ListView items
        postInfoListView.setItems(postInfoObservableList);
        postInfoListView.setCellFactory(listView -> new PostListViewCellController(currentUserIDLabel.getText()));

        //turn off selection mode
        postInfoListView.setFocusTraversable(false);

        FilteredList<Post> filteredData = new FilteredList<>(postInfoObservableList, p -> true);

        typeChoiceBox.getSelectionModel().selectedItemProperty().addListener((observableValue, oldValue, newValue) -> {
            filteredData.setPredicate(post -> {
                if (newValue == "Event" && post instanceof Event) {
                    return true;
                } else if (newValue == "Sale" && post instanceof Sale) {
                    return true;
                } else if (newValue == "Job" && post instanceof Job) {
                    return true;
                } else if (newValue == "All") {
                    return true;
                }
                return false;
            });
            postInfoListView.setItems(filteredData);
        });

覆盖 updateItem 的代码

    protected void updateItem(Post post, boolean empty) {
        super.updateItem(post, empty);
        if(empty || post ==null){
            setText(null);
            setGraphic(null);
        }
        else {
            if(mlLoader == null){
                mlLoader = new FXMLLoader(getClass().getResource("/view/post_listView_cell.fxml"));
                mlLoader.setController(this);
                try {
                    mlLoader.load();
                } catch (IOException e) {
                    e.printStackTrace();
                }

                //set common details of post
                titleLabel.setText(post.getTitle());
                postIDLabel.setText(post.getId());
                creatorIDLabel.setText(post.getCreatorId());
                statusLabel.setText(post.getStatus());
                descriptionLabel.setText(post.getDescription());

                postImageView.setImage(post.getPhoto());

                //set other details according the types of post
                if(post instanceof Event){
                    hbox.setStyle("-fx-background-color: LIGHTCYAN ");
                    label00.setText("Venue:");
                    label01.setText("Date:");
                    label02.setText("Capacity:");
                    label03.setText("Attendee count:");

                    label10.setText(((Event) post).getVenue());
                    label11.setText(((Event) post).getDate());
                    label12.setText(Integer.toString(((Event) post).getCapacity()));
                    label13.setText(Integer.toString(((Event) post).getAttendeeCount()));
                }else if(post instanceof Sale){
                    hbox.setStyle("-fx-background-color: LIGHTPINK ");
                    label00.setText("Highest offer:");
                    label01.setText("Minimum raise:");

                    label10.setText("$"+ ((Sale) post).getHighestOffer());
                    label11.setText("$"+ ((Sale) post).getMinRaise());

                    //Check information about current user to decide show Asking price or not
                    if(currentUserID.equalsIgnoreCase(post.getCreatorId())){
                        label02.setText("Asking price:");
                        label12.setText("$"+ ((Sale) post).getAskingPrice());
                    }
                }else if(post instanceof Job){
                    hbox.setStyle("-fx-background-color: LIGHTYELLOW ");
                    label00.setText("Proposed price:");
                    label01.setText("Lowest offer:");

                    label10.setText("$" + ((Job) post).getProposedPrice());
                    label11.setText("$"+ ((Job) post).getLowestOffer());
                }

                setText(null);
                setGraphic(hbox);
                //TODO recognize different post

            }
        }
    }

第一次加载 图像效果很好 但是在更改选择框几次后它错过了一些帖子,但仍然可以在 ListView 上选择项目在此处输入图像描述

没有人知道这是什么问题吗?

标签: listviewjavafx

解决方案


推荐阅读