我有一个带有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();
}
}
}
}
谢谢和问候!
迭
答案 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
}