滚动视图中的ListView:如何知道滚动位置(是否在底部?)

滚动视图中的ListView:如何知道滚动位置(是否在底部?),listview,scroll,position,qml,scrollview,Listview,Scroll,Position,Qml,Scrollview,我有一个WML应用程序,里面有一个ScrollView和一个ListView。ListView中的项目具有可变高度 我需要知道滚动条何时移动,实际上何时在底部,何时不在底部。我的目标是在向ListView添加项目时,仅当滚动处于底部时,才将滚动保持在底部(positionViewAtEnd())。如果不在底部,则不会使用positionViewAtEnd() 我试过“玩”身高、知足、高和知足。有时它可以工作(当滚动在底部时:contentHeight==contentY+height),但其他时

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

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

我试过“玩”身高、知足、高和知足。有时它可以工作(当滚动在底部时: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();
            }
            }
        }
   }
谢谢和问候


Diego

计算失败的原因是由于代理高度可变,
ListView
不得不调整其原点。包括到计算中将有助于获得正确的值,但有一种更方便的方法来检查是否存在
Flickable


编辑:这是一个小技巧,但另一种实现自动滚动的方法(或者更确切地说,是为了避免滚动的需要)是使用
ListView.bottomtoop
。然后,如果附加到末尾,则在模型的开头插入新消息。这样,当新消息到达时,内容保持与底部对齐,而无需进行任何手动定位。不过有一个小陷阱。当视图中的内容不足时,内容也会与底部对齐。

计算失败的原因是
列表视图
由于代理高度可变,必须调整其原点。包括到计算中将有助于获得正确的值,但有一种更方便的方法来检查是否存在
Flickable

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

编辑:这是一个小技巧,但另一种实现自动滚动的方法(或者更确切地说,是为了避免滚动的需要)是使用
ListView.bottomtoop
。然后,如果附加到末尾,则在模型的开头插入新消息。这样,当新消息到达时,内容保持与底部对齐,而无需进行任何手动定位。不过有一个小陷阱。当内容少于视图中的内容时,内容也会与底部对齐。

是的,这就是在模型开头插入时
verticalLayoutDirection:ListView.BottomToTop
所做的,例如
listModel.insert(0,{text:“foo”})
。是的,这就是
verticalLayoutDirection:ListView.BottomToTop
在模型开头插入时所做的,例如
listModel.insert(0,{text:“foo”})
  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");
                }
            }
        }