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を2回含めることはできず、ノードのクローンを作成する方法はありません(私が知る限り)。

回避策は、マップをの代わりにHashMapストアにし、最後の行をに変更することです。ImageImageView

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 に答える