通过ListView获取ListCell

Fra*_*oth 9 javafx

我有ListView自己的ListCell<MyObject>实现.通过网络信号,我收到应该更改的ListCell的索引.

listView.getItems().get(index);那里访问模型没有问题,但是我希望使用接收到的索引对listCell进行布局更改,并将布局更改为ListCellindex+1;

如何通过ListView访问ListCell?

我搜索这样的方法:

listView.getListCell(index);
Run Code Online (Sandbox Code Playgroud)

inv*_*ant 5

不幸的是,现在没有 API 可以通过索引获取 List Cell 或获取 ListView 的所有子项(listcells)。一种解决方案是,在 MyObject 类中定义一个新的 StringProperty specialIndicator。

 class MyObject {

        ....//u r properties
        private StringProperty specialIndicator;
Run Code Online (Sandbox Code Playgroud)

当您从网络信号中获取索引时,请设置对象的这个 specialIndicator 属性并强制刷新 ListView

public void onReceivedNetWorkSignalIndex() {
 listView.getItems().get(indexFromService).setSpecialIndicator("selected");
 listView.getItems().get(indexFromService+1).setSpecialIndicator("selectedplusone");
//force refresh listview (it will trigger cellFactory again so that you can manipulate layout)
 listView.setItems(null);
 listView.setItems(allObjects);

}
Run Code Online (Sandbox Code Playgroud)

由于您已经拥有自定义 Object ListView ,我假设您已经拥有自定义 cellFactory(如果没有,您必须创建一个),修改您的自定义单元工厂以处理此特殊指标

         listView.setCellFactory(new Callback<ListView<MyObject>, ListCell<MyObject>>() {
                    @Override
                    public ListCell<MyObject> call(ListView<MyObject> myObjectListView) {
                        ListCell<MyObject> cell = new ListCell<MyObject>(){
                            @Override
                            protected void updateItem(MyObject myObject, boolean b) {
                                super.updateItem(myObject, b);
                                if(myObject != null) {
                                    setText(myObject.getName());
                                    if("selected".equalsIgnoreCase(myObject.getSpecialIndicator())) {
                                        System.out.println("Setting new CSS/graphics for index retun from service." + myObject.getName());
                                    } else if("selectedplusone".equalsIgnoreCase(myObject.getSpecialIndicator())) {
                                        System.out.println("Setting new CSS/Graphics for index+1 returned from service" + myObject.getName());
                                    }
                              myObject.setSpecialIndicator(""); // reset it back to empty
                                }
                            }
                        };

                        return cell;
                    }
                });
Run Code Online (Sandbox Code Playgroud)

这是整个示例应用程序,您可以查看它(以防上面的解释不清楚)。 在此处输入图片说明

public class ListViewTest extends Application {


    @Override
    public void start(Stage stage) throws Exception {

        VBox root = new VBox();
        final ObservableList<MyObject> allObjects = FXCollections.observableArrayList(new MyObject("object0"), new MyObject("object1"),new MyObject("object2"),new MyObject("object3"),new MyObject("object4"));
       final  ListView<MyObject> listView = new ListView<>(allObjects);
        listView.setCellFactory(new Callback<ListView<MyObject>, ListCell<MyObject>>() {
            @Override
            public ListCell<MyObject> call(ListView<MyObject> myObjectListView) {
                ListCell<MyObject> cell = new ListCell<MyObject>(){
                    @Override
                    protected void updateItem(MyObject myObject, boolean b) {
                        super.updateItem(myObject, b);
                        if(myObject != null) {
                            setText(myObject.getName());
                            if("selected".equalsIgnoreCase(myObject.getSpecialIndicator())) {
                                System.out.println("Setting new CSS/graphics for index retun from service." + myObject.getName());
                                setText("I am selected Index from Service");
                            } else if("selectedplusone".equalsIgnoreCase(myObject.getSpecialIndicator())) {
                                System.out.println("Setting new CSS/Graphics for index+1 returned from service" + myObject.getName());
                                setText("I am selected Index +1  from Service");
                            }
                            myObject.setSpecialIndicator(""); // reset it back to empty
                        }
                    }
                };

                return cell;
            }
        });
        Button serviceIndex2 = new Button("ServiceIndex2");
        serviceIndex2.setOnAction(new EventHandler<ActionEvent>() {
            @Override
            public void handle(ActionEvent actionEvent) {
                int indexFromService =2;
                listView.getItems().get(indexFromService).setSpecialIndicator("selected");
                listView.getItems().get(indexFromService+1).setSpecialIndicator("selectedplusone");
                listView.setItems(null);
                listView.setItems(allObjects);
            }
        });
        root.getChildren().addAll(listView,serviceIndex2);
        Scene scene = new Scene(root,500,500);
        stage.setScene(scene);
        stage.show();

    }

    public static void main(String[] args) {
        launch(args);
    }

    class MyObject {

        private StringProperty name;
        private StringProperty specialIndicator;

        MyObject(String name) {
            this.name = new SimpleStringProperty(name);
            this.specialIndicator = new SimpleStringProperty();
        }

        public String getName() {
            return name.get();
        }

        public StringProperty nameProperty() {
            return name;
        }

        public void setName(String name) {
            this.name.set(name);
        }

        public String getSpecialIndicator() {
            return specialIndicator.get();
        }

        public StringProperty specialIndicatorProperty() {
            return specialIndicator;
        }

        public void setSpecialIndicator(String specialIndicator) {
            this.specialIndicator.set(specialIndicator);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)