ScrollView中的ListView:如何知道滚动位置(它在底部?)

时间:2016-06-23 07:43:15

标签: listview scroll position qml scrollview

我有一个带有ScrollView和ListView的WML应用程序。 ListView中的项目具有可变高度。

我需要知道滚动条何时被移动,实际上当它在底部时和不在时。当我将项目添加到ListView时,如果滚动位于底部,我的目标是在底部保持滚动(positionViewAtEnd())。如果NOT不在底部,则不会使用positionViewAtEnd()。

我试过"玩"高度,含量高& contentY。有时它可以工作(当滚动位于底部:contentHeight == contentY + height),但其他时候contentY值更改为负值,我的代码失败...

任何帮助?

非常感谢

感谢J-P Nurmi,

我已经尝试过' atYEnd'在几个属性更改中,检测滚动是否在底部

它似乎有效,然后我在' onCountChanged'将滚动放入(或不放置)底部

一旦所有ListView高度都充满了消息,它就会起作用,但不是在一种情况下:当传入消息是填充消息时 ListView高度(第一次,contentY不是' 0')。

我不知道是否清楚......

我已经简化了我要测试的代码(包括委托),现在看来是这样的:

 FocusScope {
        clip: true

        id: focusScopeView

        width: parent.width; height: parent.height

        ScrollView {

            width: parent.width; height: parent.height

            ListView {
                id: listTexts

                width: parent.width; height: parent.height

                property bool bScrolled: false

                model: textsModel
                delegate: Text { text: "Contact:\t" + eventText }

                onCountChanged: {

                    if (!bScrolled)
                         positionViewAtEnd();
        }

                onContentYChanged: {
                    bScrolled = !atYEnd;

                    if (atYEnd)
                        positionViewAtEnd()
        }

                onContentHeightChanged: {
                    if (!bScrolled)
                         positionViewAtEnd();
            }
            }
        }
   }

谢谢和问候!

3 个答案:

答案 0 :(得分:0)

计算失败的原因是由于可变高度的委托,ListView必须调整其原点。在计算中加入originY有助于获得正确的值,但有一种更方便的方法可以检查Flickable是否为atYEnd

编辑:这是一个技巧,但另一种自动滚动方式(或者更确切地说,为了避免滚动)是使用ListView.BottomToTop作为vertical layout direction。然后,如果追加到最后,则在模型的开头插入新消息。这样,当新消息到达时内容保持与底部对齐,而不进行任何手动定位。但是有一点点了。当内容少于视图中的内容时,内容也会与底部对齐。

答案 1 :(得分:0)

  ListView {
        onContentYChanged: {
             if (contentY === contentHeight - height) {
               console.log("scrolled to bottom");
             }
        }
    }


    ScrollView {
            flickableItem.onContentYChanged: {
                if (flickableItem.contentY === flickableItem.contentHeight - viewport.height) {
                    console.log("scrolled to bottom");
                }
            }
        }

答案 2 :(得分:0)

ListView { 
        ScrollBar.vertical: ScrollBar {
                id: taskScroll
            }
        property bool atBottom: (taskScroll.position + taskScroll.size) == 1
    }