列表视图突出显示非常缓慢

时间:2015-12-08 09:24:13

标签: android qml qt5 qtquick2

我使用model-view-delegate范例实现了一个简单的QML应用程序。在我的应用程序中,我使用highlight属性为我ListView的当前所选项加下划线。选择工作正常,但是当我点击远处的项目时,突出显示的移动速度非常慢。

考虑以下示例:

import QtQuick 2.5

ApplicationWindow {
    width: 500
    height: 400
    title: qsTr("List test")
    visible: true

    ListView {
        id: view
        anchors.fill: parent
        model: 20

        delegate: Rectangle {
            border.color: "steelblue"
            color: Qt.lighter(border.color)
            width: ListView.view.width
            height: 20

            Text { anchors.centerIn: parent; z: 2; text: index + 1 }

            MouseArea {
                anchors.fill: parent
                onClicked: view.currentIndex = index
            }
        }

        highlight: Rectangle {
            border.color: "yellow"
            border.width: 3
            color: "transparent"
            height: 20
            width: ListView.view.width
            z: Infinity
        }
    }
}

如果选择最后一个元素,突出显示将移动到所有其他项目,然后再到达所选项目。那不是我期望的行为。如何将突出显示直接移到最后?

1 个答案:

答案 0 :(得分:3)

根据highlightFollowsCurrentItem的文档,您所遇到的行为是预期的行为:

  

此属性用于确定突出显示是否由视图管理

     

如果此属性为true(默认值),则会突出显示突出显示以跟随当前项。否则,视图不会移动突出显示,并且必须通过突出显示任何移动。

高亮动画由highlightMoveDurationhighlightMoveVelocity属性控制。速度设置为400 pixels/second,这个值可以与具有长视图的高密度设备上的长时间运行动画相对应。

您可以通过两种不同的方式解决问题:

  • 通过微调上述属性(例如设置一个非常小的highlightMoveDuration或高highlightMoveVelocity
  • highlightFollowsCurrentItem设置为false并直接管理突出显示动画

在第二种情况下,您放弃动画并直接将突出显示y位置与当前所选代理的y绑定。这样,突出显示会立即移动到选定的代理,如下例所示:

import QtQuick 2.5

ApplicationWindow {
    width: 500
    height: 400
    title: qsTr("List test")
    visible: true

    ListView {
        id: view
        anchors.fill: parent
        model: 20

        highlightFollowsCurrentItem: false    // force discarding default animation

        delegate: Rectangle {
            border.color: "steelblue"
            color: Qt.lighter(border.color)
            width: ListView.view.width
            height: 20

            Text { anchors.centerIn: parent; z: 2; text: index + 1 }

            MouseArea {
                anchors.fill: parent
                onClicked: view.currentIndex = index
            }
        }

        highlight: Rectangle {
            border.color: "yellow"
            border.width: 3
            color: "transparent"
            height: 20
            width: ListView.view.width
            y:  view.currentItem.y      // highlighting direct binding to selected item!
            z: Infinity
        }
    }
}