【发布时间】:2013-12-18 14:59:50
【问题描述】:
我从 JavaFX 的文档中了解到,当单元格数量不足以填充提供的 ListView 区域(或其他类似区域)时,会生成新的单元格。否则,现有单元格会被重用,方法是在每个单元格上调用 updateItem 方法以及相应的项目。
我正在实现一个聊天应用程序,其中用户向文本区域写入内容,按下回车键并将聊天附加到文本区域上方的历史记录中,非常简单和经典。历史是一个 ListView,显示到目前为止发送/接收的聊天列表。所以当用户按下回车键时,我会在底层的 observable 列表中添加一个新项目,所以它会显示在 ListView 中。
问题是,当一个新的聊天被追加到 ListView 时,列表中有某种闪烁,更新列表中的项目需要一点时间。 但是,新添加的聊天位于列表末尾,用户看不到(现在需要向下滚动)。所以实际上不需要更新已经可见的单元格,但确实需要。我试图简化updateItem方法的内容,但是没办法……它总是在闪烁。
然后我实现了一个简单的类,例如;
public class IdGenerator {
private static IdGenerator instance = new IdGenerator();
private int id = 0;
public static IdGenerator getInstance() {
return instance;
}
public synchronized int getId() {
return ++id;
}
}
然后将id分配给生成的单元格;
public class CommunicationEntityCell extends ListCell<CommunicationEntity> {
...
private int id = IdGenerator.getInstance().getId();
....
@Override
protected synchronized void updateItem(CommunicationEntity entity, boolean empty) {
super.updateItem(entity, empty);
System.out.println(id);
....
}
}
我观察到,当一个新项目被添加到基础列表中时,单元格被复制,而不是被回收。 (无论如何,这可能是眨眼的原因)
细胞被复制是否正常/合乎逻辑/预期?这是一个已知的错误?你见过这个吗?任何解决方法都将受到高度赞赏。
【问题讨论】: