CharmListView Бесконечный свиток - PullRequest
0 голосов
/ 21 мая 2018

Мне нужно в основном событие, которое срабатывает при каждых 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;

Я хотел бы вызвать свой внутренний методкогда прокрутка вниз получает конец последнего извлеченного блока и т. д., пока не получится конец данных, например, метод "бесконечной прокрутки".

Спасибо!

1 Ответ

0 голосов
/ 22 мая 2018

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();
    }
}

Infinite scrolling

Примечание такжечто вы можете воспользоваться методом setOnPullToRefresh() в любое время.Например, если вы добавите это:

listView.setOnPullToRefresh(e -> addBatch());

всякий раз, когда вы переходите в верхнюю часть списка и перетаскиваете его вниз (на мобильном устройстве), он выполняет другой вызов для загрузки новой партии элементов.Очевидно, что это поведение, противоположное «бесконечной прокрутке», но это возможно и с помощью элемента управления CharmListView.

...