JavaFX在ListView中的搜索

3

我想在listview中进行搜索,我的代码可以工作,但不够好。问题是当我在搜索文本字段中写入几个字符时,不仅结果出现了,而且其余的项目也出现了...

代码:

// Wrap the ObservableList in a FilteredList (initially display all data).
    FilteredList<Client> filteredData = new FilteredList<>(main.getClientListData(),p -> true);

    //Set the filter Predicate whenever the filter changes.
    searchUserTF.textProperty().addListener((observable, oldValue, newValue) -> {
        filteredData.setPredicate(client ->{
            // If filter text is empty, display all persons.
            if(newValue == null || newValue.isEmpty()){
                return true;
            }

            // Compare first name and last name of every client with filter text.
            String lowerCaseFilter = newValue.toLowerCase();

            if(client.getFirstname().toLowerCase().contains(lowerCaseFilter)){
                return true; //filter matches first name
            }else if(client.getLastname().toLowerCase().contains(lowerCaseFilter)){
                return true; //filter matches last name
            }
            return false; //Does not match
        });
    });

    //Wrap the FilteredList in a SortedList.
    SortedList<Client> sortedData = new SortedList<>(filteredData);

    //put the sorted list into the listview
    clientListView.setItems(sortedData);

照片: 原始列表: 原始列表

排序后的列表: 排序后的列表

ListCell实现:

 clientListView.setCellFactory(new Callback<ListView<Client>, ListCell<Client>>() {
        @Override
        public ListCell<Client> call(ListView<Client> param) {
            final Label leadLbl = new Label();
            final Tooltip tooltip = new Tooltip();
            final ListCell<Client> cell = new ListCell<Client>(){
              @Override
                public void updateItem(Client item, boolean empty){
                  super.updateItem(item,empty);
                  if(item != null){
                      leadLbl.setText(item.getFirstname());
                      setText(item.getFirstname()+" "+item.getLastname());
                      tooltip.setText(item.getFirstname());
                      setTooltip(tooltip);
                  }
              }
            };
            return cell;
        }
    });
1个回答

5

你的问题不在于筛选逻辑。

我认为你有一个糟糕的ListCell实现,当它应该显示空内容时,它没有清除其文本。

更新

是的,当项目为null时,你的单元格渲染器不清除该单元格。尝试使用以下代码:

        final ListCell<Client> cell = new ListCell<Client>(){
          @Override
            public void updateItem(Client item, boolean empty){
              super.updateItem(item,empty);
              if(item != null){
                  leadLbl.setText(item.getFirstname());
                  setText(item.getFirstname()+" "+item.getLastname());
                  tooltip.setText(item.getFirstname());
                  setTooltip(tooltip);
              }
              else {
                  leadLbl.setText("");
                  setText("");
              }
          }
        };

2
你可能也想在else子句中加入setTooltip(null)(否则悬停在空单元格上可能会产生奇怪的结果)。 - James_D

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接