3

我正在尝试构建一个 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));
  }
}
4

3 回答 3

5

场景图在 JavaFX中不能包含相同的Node两次,并且无法克隆节点(据我所知)。

一种解决方法可能是让您的地图成为HashMap商店Image而不是ImageView,并将最后一行更改为

setGraphic(new ImageView(images.get(imageUrl)));

这样你至少会缓存实际的加载Image,这应该是最繁重的部分。

于 2013-03-02T16:45:19.570 回答
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;
}
于 2013-03-06T13:44:39.293 回答
0

做这样的事情:

ImageView image = ...
ImageView src   = ...
image.setImage(src.getImage());
于 2015-06-25T17:01:12.340 回答