【问题标题】:Removing items from ListView strange behaviour从 ListView 中删除项目的奇怪行为
【发布时间】:2014-10-06 19:46:58
【问题描述】:

我正在使用 ListView。向 ListView 添加新项目很容易,但如何删除呢?

我以这种方式构建我的 ListView:

public Node buildListView() {
        ObservableList<String> myList =  FXCollections.observableArrayList();
        int counter = 0;
        for(int i=0; i<10; i++) {
            myList.add("Number " + new Integer(i+1).toString());
        }
        ListView<String> listView = new ListView<>();
        listView.setItems(myList);

        listView.setCellFactory(new Callback<ListView<String>, ListCell<String>> (){
            @Override
        public ListCell<String> call(ListView<String> arg0) {
                return new listcells.ListcellY(listView);

            }

        });
        return listView;
}

ListcellY 的一个实例在 setGraphics 中设置一个标签。要从我的 ObservableList 中删除与其关联的字符串,我添加了一个 MouseEvent 处理程序:

public class ListcellY extends ListCell<String> {
    Label label;
    HBox hbox;
    ListView<String> listView;

    public ListcellY( ListView<String> listView ) {
        super();
        this.listView = listView; // Here I pass the reference to my list. Is it a gd way to do that? 
    }
    @Override
    protected void updateItem(String item, boolean empty) {
        super.updateItem(item, empty);
        if(item!=null){
            label = new Label(item);

            label.addEventHandler(MouseEvent.MOUSE_CLICKED, e -> { 
                System.out.println("CLicked on : " + item);
                for(String s : listView.getItems()) {
                    System.out.println("  " + s);
                }

                listView.getItems().remove(item);  // Here I remove the item form my list.
                System.out.println("list size : " + listView.getItems().size());
            });
            setGraphic(label);

        } 

    }
}

虽然此代码通过从我的 ObservableList 中删除每个单击的项目来工作,但 listView 的行为却很奇怪。每次单击标签时,它都会从我的 ListView 中成功消失,但是会在该 ListView 的末尾自动添加一个新项目,显示最后一个标签文本的名称(但它不是可点击的标签)。 它不断重复,直到我的 ObservableList 为空。然后 ListView 什么都不显示。

我只是想让我点击的标签消失,而不会在我的 TreeView 中获得任何新的“视觉副本”。如果索引参数设置为我的 ObservableList 的原始大小,则 ListView 会复制最后一个元素,直到它获得正确数量的元素。但我不明白它是怎么做到的。

我能做什么,首先发生了什么?

【问题讨论】:

  • 是否有任何理由不通过将 changelistener 附加到 list.getSelectionModel().selectedItemProperty() 来删除项目?
  • 是的!那是因为我对 javafx 很陌生,不熟悉这种做法。我该怎么做?

标签: listview javafx


【解决方案1】:

好吧,似乎写下你的问题可以让你的大脑更好地工作!我有正确的直觉: 在我扩展的 ListCell 类中,我检查了覆盖的更新方法是否我的项目不为空。但是我不处理它为空的情况,在这种情况下我必须将图形设置为空!我仍然不明白为什么,但它有效! 这是更新的课程:

public class ListcellY extends ListCell<String> {
    Label label;
    HBox hbox;
    ListView<String> listView;

    public ListcellY( ListView<String> listView ) {
        super();
        this.listView = listView; // Here I pass the reference to my list. Is it a gd way to do that? 
    }
    @Override
    protected void updateItem(String item, boolean empty) {
        super.updateItem(item, empty);
        if(item!=null){
            label = new Label(item);

            label.addEventHandler(MouseEvent.MOUSE_CLICKED, e -> { 
                System.out.println("CLicked on : " + item);
                for(String s : listView.getItems()) {
                    System.out.println("  " + s);
                }

                listView.getItems().remove(item);  // Here I remove the item form my list.
                System.out.println("list size : " + listView.getItems().size());
            });
            setGraphic(label);

        }
        else {
            setGraphics(null);
        } 

    }
}

【讨论】:

  • “我还是不知道到底是为什么”:假设你的列表中有五个项目;五个显示在单元格中。当您删除一个时,您显然现在有四个项目,但您仍然可以看到所有五个单元格(可能还有其他一些单元格)。其中一个单元格将通过使用参数updateItem(null, true) 调用其updateItem 方法来更新。您需要该单元格来删除它正在显示的图形。
  • 如果没有足够的项目,ListView 使用空单元格来填充视口。调用updateItem(/* item = */ null, /* empty = */ true) 后,单元格被认为是空的,用于填充剩余区域。
  • 感谢您的回复。我为空单元格得到它,但是如何解释不将图形设置为 null 会使那些空单元格显示最后一项的内容这一事实?这里我只检查是否(item==null)。布尔“空”能给我带来什么信息?
  • 如果您不将图形设置为null,则单元格将继续显示之前的图形,当它不为空时。布尔标志empty 用于区分null 是项目的有效值的情况。拥有null 物品是不好的做法,但并不禁止。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-11
  • 1970-01-01
  • 2018-01-16
  • 1970-01-01
  • 2014-03-21
  • 1970-01-01
相关资源
最近更新 更多