CharmListCell
не отображает индекс базового listView, но даже если бы он это сделал, это не очень помогло бы выяснить, прокручиваете ли вы конец текущего списка или нет.
Я бы предложил другой подход, который также действителен для обычного ListView
, с преимуществом наличия функций CharmListView
(главным образом, заголовков и индикатора обновления).
ЭтоКраткий пример, созданный с помощью одного проекта представления с использованием плагина Gluon IDE и Charm 5.0.0, показывает, как создать элемент управления CharmListView
и заполнить его 30 элементами за раз.Я не предоставил ни фабричную ячейку, ни заголовки, а для простоты просто добавляю последовательные целые числа.
При поиске и после показа представления (поэтому listView добавляется всцена), мы находим вертикальный ScrollBar
listView, а затем мы добавляем слушателя, чтобы отслеживать его положение.Когда он приближается к 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());
всякий раз, когда вы переходите в верхнюю часть списка и перетаскиваете его вниз (на мобильном устройстве), он выполняет другой вызов для загрузки новой партии элементов.Очевидно, что это поведение, противоположное «бесконечной прокрутке», но это возможно и с помощью элемента управления CharmListView
.