如果我在ListView中选择一个带有标题的项目,我希望列表以简短的动画向上滚动,以将当前选定的项目放置在列表的顶部,并且标题向上移动并且不可见。这适用于以下代码。但是,当我想向下滚动以再次看到列表标题时,它总是会跳回到列表的顶部(第一项)。这很可能是由highlightRangeMode: ListView.StrictlyEnforceRange
引起的。但是我该如何避免呢?
我尝试过highlightRangeMode: ListView.ApplyRange
,它使我再次滚动到标题,但是这导致项目通常不会移到顶部,这是不可接受的。
我尝试了headerPositioning: ListView.PullBackHeader
,但给了我与headerPositioning: ListView.PullBackHeader
ListView {
id: list
anchors.fill: parent
clip: true
spacing: 11
focus: true
highlightMoveDuration: 400
snapMode: ListView.SnapToItem
preferredHighlightBegin: 0
preferredHighlightEnd: 100
highlightRangeMode: ListView.StrictlyEnforceRange
headerPositioning: ListView.InlineHeader
header: Rectangle {
id: headerBar
height: 116
color: "blue"
anchors {
left: parent.left
right: parent.right
leftMargin: 12
rightMargin: 12
}
}
model: myModel
delegate: ListItem {
height: 56
width: list.width
color: "red"
onListItemClicked: {
list.currentIndex = index
}
}
}
我希望ListView中的选定项始终滚动到列表顶部(在preferredHighlightBegin
和preferredHighlightEnd
内部),并且我可以手动向下滚动以查看ListView标头。有人知道解决方案吗?
由于我不想使用滚动条,因此在How can I animate scrolling in a QML ScrollView?中看不到解决方案。
答案 0 :(得分:1)
您只能在点击时应用严格的范围,然后将其删除以使鼠标平滑滚动:
ListView {
// ....
highlightRangeMode: ListView.NoHighlightRange
delegate: ListItem {
// ...
onListItemClicked: {
list.highlightRangeMode = ListView.StrictlyEnforceRange
list.currentIndex = index
list.highlightRangeMode = ListView.ApplyRange
}
}
}