Problem with ListView dynamic height



  • I am having a ListView and have applied a scroll bar on it. The scrollbar is working fine if each row is of same height. But when the heights of rows vary then scrollbar starts behaving unexpectedly. I found out that the ListView redraws its elements while flicking. So the contentHeight changes it's value in case of different row heights while scolling. I am using Qt 4.7 and QtQuick 1.0 versions of Qt and QML respectively.

    @Item {
    id: myItem
    property variant items

    ListView {
    id: list
    anchors.fill: parent
    clip: true
    model: items
    delegate: trackDelegate
    focus: true
    boundsBehavior: Flickable.StopAtBounds
    }
    }

    ScrollBar {
    id: verticalScrollBar
    target: list
    clip: true
    }
    }

    And scroll bar code is
    // import QtQuick 1.0 // to target S60 5th Edition or Maemo 5
    import Qt 4.7
    Item {
    property variant target
    width: 8
    anchors.top: target.top
    anchors.bottom: target.bottom
    anchors.margins: 1
    anchors.rightMargin: 2
    anchors.bottomMargin: 2
    anchors.right: target.right
    visible: (track.height == slider.height) ? false : true
    Image {
    id: scrollPath
    width: 2
    anchors.top: parent.top
    anchors.bottom: parent.bottom
    anchors.horizontalCenter: parent.horizontalCenter
    source: "qrc:/resources/buttons/slider2.png"
    }
    Item {
    anchors.fill: parent
    Timer {
    property int scrollAmount
    id: timer
    repeat: true
    interval: 20
    onTriggered: {
    target.contentY = Math.max(0, Math.min(target.contentY + scrollAmount,
    target.contentHeight - target.height));
    }
    }
    Item {
    id: track
    anchors.top: parent.top
    anchors.topMargin: 1
    anchors.bottom: parent.bottom
    width: parent.width
    MouseArea {
    anchors.fill: parent
    onPressed: {
    timer.scrollAmount = target.height * (mouseY < slider.y ? -1 : 1)
    timer.running = true;
    }
    onReleased: {
    timer.running = false;
    }
    }
    Image {
    id:slider
    anchors.horizontalCenter: parent.horizontalCenter
    source: "qrc:/resources/buttons/slider.png"
    width: parent.width
    height: Math.min(target.height / target.contentHeight * track.height, track.height) < 20 ? 20 : Math.min(target.height / target.contentHeight * track.height, track.height)
    y: target.visibleArea.yPosition * track.height
    MouseArea {
    anchors.fill: parent
    drag.target: parent
    drag.axis: Drag.YAxis
    drag.minimumY: 0
    drag.maximumY: track.height - height
    onPositionChanged: {
    if (pressedButtons == Qt.LeftButton) {
    target.contentY = slider.y * target.contentHeight / track.height;
    }
    }
    }
    }
    }
    }
    }

    @


Log in to reply
 

Looks like your connection to Qt Forum was lost, please wait while we try to reconnect.