我在实现延迟加载的ListView时遇到问题,其中一旦滚动条可见,我就停止用项目填充ListView。然后,当用户滚动到列表底部时,将添加ListView项。
问题是滚动时的滚动条最大限制与通过鼠标拖动滑动时的滚动条最大限制不同。因此,当通过鼠标滚动时,ListView永远不会填充新项目,因为它永远不会到达列表的底部。
以下是填充视图的代码段:
private void refreshView() {
refreshingView = true;
Platform.runLater(new Runnable() {
@Override
public void run() {
try {
if (thumbnailListView == null) {
Platform.runLater(this);
return;
}
thumbnailLayoutModelObservableList.clear();
thumbnailLayoutModelObservableList.addAll(filterThumbnails(thumbnailLayoutModels));
if(CURRENT_SORT==ThumbnailSortOrder.DESC) {
thumbnailLayoutModelSortedList.setComparator(thumbnailDateComparator.reversed());
} else {
thumbnailLayoutModelSortedList.setComparator(thumbnailDateComparator);
}
newThumbQueue.removeAll(thumbnailLayoutModelObservableList);
updateCounts();
if(!scrollListenerAttached) {
ScrollBar scrollBar = getListViewScrollBar();
if (scrollBar != null) {
scrollBar.valueProperty().addListener(scrollChangeListener);
scrollListenerAttached=true;
}
}
checkIfUIUpdateLock();
refreshingView = false;
}catch(Exception e) {
logger.error("Error refreshing view",e);
}
}
});
}
checkIfUIUpdateLock()锁定方法如下:
private void checkIfUIUpdateLock() {
ScrollBar scrollBar = getListViewScrollBar();
if (scrollBar != null && scrollBar.isVisible()) {
double position = scrollBar.getValue();
if(CURRENT_SORT == ThumbnailSortOrder.ASC) {
if(position != scrollBar.getMax()) {
pauseUIScroll = true;
}
else {
pauseUIScroll = false;
}
} else if(CURRENT_SORT == ThumbnailSortOrder.DESC) {
if(position != scrollBar.getMin()) {
pauseUIScroll = true;
}
else {
pauseUIScroll = false;
}
}
}
}
pauseUIScroll boolean控制向ListView添加元素。
有没有办法让ListView重新计算滚动条边界?我尝试使用refresh()和requestLayout(),但它没有修复滚动条。
我做了一些调试,发现scrollbar.getMax()返回的最大值是一个大于1的数字,而滚动条只通过鼠标滚动滚动到最大值1。这是JavaFX中可能存在的错误吗?