代码之家  ›  专栏  ›  技术社区  ›  Antonio Marcos

CharmListView无限卷轴

  •  1
  • Antonio Marcos  · 技术社区  · 8 年前

    我基本上需要一个事件,它在加载的每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 回复  |  直到 8 年前
        1
  •  1
  •   José Pereda    8 年前

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

    Infinite scrolling

    还请注意,您可以从 setOnPullToRefresh() 方法,随时。例如,如果添加此项:

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

    每当你到列表的顶部(在移动设备上)将其向下拖动时,它会再次调用以加载新的一批项目。显然,这是与“无限滚动”相反的行为,但也可能与 魅力列表视图 控制。