我基本上需要一个在每加载200条记录时触发的事件,因此可以加载更多数据直到数据结束。
我尝试扩展CharmListCell并使用方法updateItem,如下所示:
@Override
public void updateItem(Model item, boolean empty) {
super.updateItem(item, empty);
currentItem = item;
if (!empty && item != null) {
update();
setGraphic(slidingTile);
} else {
setGraphic(null);
}
System.out.println(getIndex());
}
但 System.out.println(getIndex()); 方法返回-1;
我想调用后端方法,当向下滚动到达最后一个获取块的结尾时依此类推,直到得到数据结束,如"无限滚动"技术
谢谢!
答案 0 :(得分:1)
CharmListCell
没有公开底层listView的索引,但即使它确实如此,那么找出你是否在滚动结束时也没有多大帮助。当前列表与否。
我建议使用另一种方法,该方法对常规ListView
也有效,具有CharmListView
功能(主要是标题和刷新指示符)的优势。
使用Gluon IDE plugin和Charm 5.0.0通过单个视图项目创建的这个简短示例演示了如何创建CharmListView
控件,并一次填充30个项目。我还没有提供工厂单元,也没有提供标题,为了简单起见,我只是添加了连续的整数。
使用查找,并在显示视图后(将listView添加到场景中),我们找到listView的垂直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());
每当您转到列表顶部并将其向下拖动(在移动设备上)时,它将再次调用以加载新批次的项目。显然,这是&#34;无限滚动&#34;的相反行为,但它也可能与CharmListView
控件一起使用。