[Qt-qml] ListView and visible items

Adriano Rezende adriano.rezende at openbossa.org
Thu Feb 3 14:24:41 CET 2011


On Thu, Feb 3, 2011 at 4:56 AM,  <jaakko.korpela at nokia.com> wrote:
> Hi,
>
> I am looking at ways to dig out the visible items in ListView. I have a
> requirement to trigger certain behavior every time a new item becomes
> visible while scrolling. ListView is internally aware of the items that are
> currently visible as ListView.indexAt returns -1 if the item at a certain
> coordinate is not visible. But what are the ways to find out what items are
> visible visible. I have tried a couple of approaches with my particular
> requirement.
>
> First, make use of Component.onCompleted in ListView delegates. The only
> trouble with this is that the first list item in ListView is never deleted,
> so you cannot rely on this tell you when that first item becomes visible
> while scrolling.
>
> The second approach involves using ListView.indexAt and pulling the indexes
> of the two items at the edges at a certain interval and see if there are any
> changes. This actually works, but I am not really happy with this approach.
>
> Any suggestions?

You can add to your delegate a boolean property binded to the ListView
visible bounding rect. So any change you want to apply on the item you
can bind to this property.

For example:

Item {
    width: 500
    height: 500

    Component {
        id: listDelegate

        Rectangle {
            width: parent.width
            height: 60
            opacity: 0.7
            border.width: 1
            color: isVisible ? "red" : "blue"

            property bool isVisible : ((y >= ListView.view.contentY &&
                                        y <= ListView.view.contentBottom) ||
                                       (y + height >= ListView.view.contentY &&
                                        y + height <=
ListView.view.contentBottom))
        }
    }

    Rectangle {
        anchors.fill: listView
        color: "green"
    }

    ListView {
        id: listView
        cacheBuffer: 1000

        anchors.fill: parent
        anchors.topMargin: 80
        anchors.bottomMargin: 80

        model: 100
        delegate: listDelegate

        property real contentBottom: contentY + height
    }
}


Maybe an attached property could be useful (like ListView.isInside ..
dummy name).

Br,
Adriano


More information about the Qt-qml mailing list