这个
CharmListCell
不会公开基础ListView的索引,但即使它公开了,也不会有太多帮助来查明是否滚动到当前列表的末尾。
我建议换一种方法,也适用于普通的
ListView
以拥有
CharmListView
功能(主要是标题和刷新指示器)。
这个简短的示例,使用Gluon IDE用单个视图项目创建
plugin
和Charm 5.0.0,演示如何创建
魅力列表视图
控件,一次填充30个项。我没有提供工厂单元,也没有提供标题,为了简单起见,我只是添加连续整数。
通过查找,在显示视图之后(这样列表视图就被添加到场景中),我们可以找到垂直的
ScrollBar
然后我们添加一个侦听器来跟踪它的位置。当它接近1时,我们模拟另一批项目的负载,使用一个表示繁重任务的暂停转换。
注意刷新指示器的使用。当添加新数据时,我们会回滚到新项目的第一个,这样我们就可以继续滚动。
public class BasicView extends View {
private final ObservableList<Integer> data;
private CharmListView<Integer, Integer> listView;
private final int batchSize = 30;
private PauseTransition pause;
public BasicView() {
data = FXCollections.observableArrayList();
listView = new CharmListView<>(data);
setOnShown(e -> {
ScrollBar scrollBar = null;
for (Node bar : listView.lookupAll(".scroll-bar")) {
if (bar instanceof ScrollBar && ((ScrollBar) bar).getOrientation().equals(Orientation.VERTICAL)) {
scrollBar = (ScrollBar) bar;
break;
}
}
if (scrollBar != null) {
scrollBar.valueProperty().addListener((obs, ov, nv) -> {
if (nv.doubleValue() > 0.95) {
addBatch();
}
});
addBatch();
}
});
setCenter(new VBox(listView));
}
private void addBatch() {
listView.setRefreshIndicatorVisible(true);
if (pause == null) {
pause = new PauseTransition(Duration.seconds(1));
pause.setOnFinished(f -> {
int size = data.size();
List<Integer> list = new ArrayList<>();
for (int i = size; i < size + batchSize; i++) {
list.add(i);
}
data.addAll(list);
listView.scrollTo(list.get(0));
listView.setRefreshIndicatorVisible(false);
});
} else {
pause.stop();
}
pause.playFromStart();
}
}
还请注意,您可以从
setOnPullToRefresh()
方法,随时。例如,如果添加此项:
listView.setOnPullToRefresh(e -> addBatch());
每当你到列表的顶部(在移动设备上)将其向下拖动时,它会再次调用以加载新的一批项目。显然,这是与“无限滚动”相反的行为,但也可能与
魅力列表视图
控制。