首先注意你的單元實現有一個bug。您需要必須處理updateItem(...)
方法中的所有可能性。在您的實現中,如果單元格當前顯示一個項目,然後作爲空單元格重用(例如,如果項目被刪除),那麼單元格將不會清除其文本。
可以顯著減少代碼量如果實現了Callback
作爲lambda表達式,而不是匿名內部類:
myList.setCellFactory(lv -> new ListCell<MyCustomData>() {
@Override
protected void updateItem(MyCustomData item, boolean empty) {
super.updateItem(item, empty);
setText(item == null ? null : item.getMyProperty());
}
});
如果你是做了很多這方面,並希望減少代碼量進一步,這不是努力創造一個可重複使用的通用電池工廠實現:
public class ListViewPropertyCellFactory<T>
implements Callback<ListView<T>, ListCell<T>> {
private final Function<T, String> property ;
public ListViewPropertyCellFactory(Function<T, String> property) {
this.property = property ;
}
@Override
public ListCell<T> call(ListView<T> listView) {
return new ListCell<T>() {
@Override
protected void updateItem(T item, boolean empty) {
super.updateItem(item, boolean);
setText(item == null ? null : property.apply(item));
}
};
}
}
,你可以用
使用
如果你喜歡一個更實用的風格,以創建實現Callback
一類,你可以做同樣
public class ListViewPropertyCellFactory {
public static <T> Callback<ListView<T>, ListCell<T>> of(Function<T, String> property) {
return lv -> new ListCell<T>() {
@Override
protected void updateItem(T item, boolean empty) {
super.updateItem(item, boolean) ;
setText(item == null ? null : property.apply(item));
}
};
}
}
和
myList.setCellFactory(ListViewPropertyCellFactory.of(MyCustomData::getMyProperty));