I'm trying to build a Twitter-style ListView, and I couldn't reuse the same ImageView multiple times in the same list. Loading multiple copies seem to be wasteful and causes scrolling to slow down due to UI Virtualization. Are there any workarounds?
public class TwitterCell extends ListCell<Object> {
private static HashMap<String, ImageView> images = new HashMap<String, ImageView>();
@Override
protected void updateItem(Object tweet, boolean empty) {
super.updateItem(tweet, empty);
Tweet t = (Tweet) tweet;
if (t != null) {
String message = t.getMessage();
setText(message);
String imageUrl = t.getImageUrl();
if (!images.containsKey(imageUrl)) {
images.put(imageUrl, new ImageView(imageUrl));
}
setGraphic(images.get(imageUrl));
}
}
Caching images is good way.
Also You can load images in background, it greatly improve performance.
Do something like this:
A scenegraph cannot contain the same
Node
twice in JavaFX, and there is no way of cloning nodes (as far as I know).A workaround would perhaps be to make your map a
HashMap
storeImage
instead ofImageView
, and change the last row toThis way you'll at least cache the loading of the actual
Image
, which should really be the heavy lifting part.