我正在尝试构建一个Twitter风格的ListView,我无法在同一个列表中多次重复使用相同的ImageView。加载多个副本似乎是浪费,并且由于UI虚拟化导致滚动速度变慢。有没有解决方法?
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));
}
}
答案 0 :(得分:5)
在JavaFX中,场景图形不能包含两次相同的Node
,并且无法克隆节点(据我所知)。
解决方法可能是让您的地图成为HashMap
商店Image
而不是ImageView
,并将最后一行更改为
setGraphic(new ImageView(images.get(imageUrl)));
这样你至少可以缓存实际Image
的加载,这实际上应该是繁重的部分。
答案 1 :(得分:0)
缓存图像是一种很好的方式。
此外,您可以在后台加载图像,它可以大大提高性能。
public Image getImage(String path, boolean backload) {
image = imageCache.get(path);
if (image == null) {
image = new Image(path, backload);
imageCache.put(path, image);
}
return image;
}
答案 2 :(得分:0)
做这样的事情:
ImageView image = ...
ImageView src = ...
image.setImage(src.getImage());