CharmListView无限滚动

时间:2018-05-21 04:13:54

标签: gluon gluon-mobile javafxports

我基本上需要一个在每加载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 :(得分: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();
    }
}

Infinite scrolling

另请注意,您可以随时使用setOnPullToRefresh()方法。例如,如果你添加这个:

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

每当您转到列表顶部并将其向下拖动(在移动设备上)时,它将再次调用以加载新批次的项目。显然,这是&#34;无限滚动&#34;的相反行为,但它也可能与CharmListView控件一起使用。