listview - 如何确定用户是否滚动到 ListView 的末尾

标签 listview javafx-8

正如标题所说。我怎样才能发现用户滚动到 javafx 中 ListView 的末尾。

最佳答案

详细阐述一下我的评论:查看 API 我的第一个冲动是在列表中注册一个 onScrollTo 处理程序,并在到达结尾时使用 doStuff(),例如

list.setOnScrollTo(e -> {
    if (e.getScrollTarget() >= list.getItems().size() -1) {
        doStuff(); 
    }  
});

不幸的是,这不起作用:如果方法之一 list.scrollTo(int)list.scrollTo( T)。这已记录在案 - 但想不出我们需要它的任何用例?

这留下了从列表的子项中挖掘 ScrollBar 并监听其 value 属性的肮脏的 ol' 变通方法(注意:需要在安装皮肤后 完成挖掘!) .

一个简单的例子:

public class ScrollToHandlerList extends Application {
    private final ObservableList<Locale> data =
            FXCollections.observableArrayList(Locale.getAvailableLocales());

    private final ListView<Locale> list = new ListView<>(data);

    @Override
    public void start(Stage stage) {
        stage.setTitle("List ScrollTo Handler " + FXUtils.version());
        Button leftScrollTo = new Button("scrollto last");
        leftScrollTo.setOnAction(e -> {
            // explicit calling notifies the onScrollHandler
            list.scrollTo(list.getItems().size() -1);
        });
        // Would expect a onScrollTo handler getting notified
        // but isn't ...
        list.setOnScrollTo(e -> {
            LOG.info("target/size" + e.getScrollTarget() + " / " + data.size());
        });
        // nor a onScroll handler ...
        list.setOnScroll(e -> {
            LOG.info("" + e);
        });
        HBox root = new HBox(leftScrollTo, list);
        Scene scene = new Scene(root);
        stage.setScene(scene);
        stage.show();

        // dirty: lookup the scrollBar and listener to its value property
        ScrollBar bar = (ScrollBar) list.lookup(".scroll-bar");
        bar.valueProperty().addListener((src, ov, nv) -> {
            LOG.info("change on value " + nv);
            if (nv.doubleValue() == 1.) {
                LOG.info("at max");
            }
        });
    }

    public static void main(String[] args) {
        launch(args);
    }
    @SuppressWarnings("unused")
    private static final Logger LOG = Logger.getLogger(ScrollToHandlerList.class
            .getName());
}

更新

通过 Twitter 获得更多信息:

  • 不通知滚动事件是 intentional ,实际上来自滚动条的事件被 VirtualFlow 阻止了
  • 有一个solution using public api只是,基本上让单元格本身知道到达滚动区域的末尾

关于listview - 如何确定用户是否滚动到 ListView 的末尾,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35392740/

相关文章:

android - 在 android 中按字母顺序使用文件夹和文件类型对 ListView 进行排序

java - 如何在 Android 中从 Fragment 调用 ArrayAdapter 构造函数

android - ListActivity 在启动时崩溃

java - 单击时填充 JavaFX 中的组合框

javafx - 需要 Bindings.equals ObservableList

Android - GC 滞后 ListView 滚动 "bigger"图像

java - 无法在 ListView 中显示我解析的数据

java - 如何重新初始化 NumberAxis 并移动到 JavaFX LineChart 中的下一个值?

java - 如何在 JavaFX 中设置字体的字母间距(又名跟踪)?

JavaFX:在最大化之前获取阶段的边界