Hi,

It seems like the ListItem delegate relies on implicit height for its geometry. 
 When the empty page is pushed, the delegates get their height set to zero, 
which causes the listview to create more delegates to fit into the visible 
area.  Since any finite height divided by zero is infinity, it attempts to 
create an infinite amount of delegates (or until it runs out of model data).

The workaround is to do something like this:

delegate: Component {
    ListItem {
        height: row.height > 5 ? row.height : 5 // don't rely on implicit 
height for sizing if it goes too small
        Row {
            id: row
            Label {
                text: index
            }
            Label {
                text: value
            }
        }
        Component.onCompleted: {
           console.debug("Created delegate: " + index)
        }
    }
}

We should definitely fix this issue in Silica to ensure that the minimal 
delegate height is clamped to 1 perhaps (well, this is probably not the right 
solution either, we'll have to think about how to do it properly).
In the meantime, please try using the workaround.

Cheers,
Chris.

________________________________________
From: devel-boun...@lists.sailfishos.org [devel-boun...@lists.sailfishos.org] 
on behalf of Hendrik Borghorst [hendrikborgho...@gmail.com]
Sent: Monday, December 16, 2013 6:49 AM
To: devel@lists.sailfishos.org
Subject: Re: [SailfishDevel] Delegate creation on demand

Sure,

This example I've just created and it does exactly what I want to show.

greetings and thanks for your support

There are 2 buttons, one populates the model with 25000 simple items.

The second one pushes a page above the page with listview. After the
push you can see the ListView creating lots of delegates in console.log

PS.: I've not tested it with qmlscene but as an application
(modeltext.tar.xz) on real device.


Am Sonntag, den 15.12.2013, 20:25 +0000 schrieb Robin Burchell:
> Can you please provide a minimal test case (i.e. ideally a single QML file, 
> usable with qmlscene) demonstrating your problem?
>
> Please see http://sscce.org/
>
> On 15 Dec 2013, at 21:03, Hendrik Borghorst <hendrikborgho...@gmail.com> 
> wrote:
>
> > Hello,
> >
> > the problem isn't my delegate. It is quite minimal.
> >
> > The problem is I think a bug in QML Listview. It goes absolutly crazy if
> > it is invisible and starts making delegate for around 50% of all items.
> > This causes the memory to run full.
> >
> > A workaround I added is
> >
> > model: visible ? modelVar : null
> >
> > which works quite nicely. I think this bug could be an upstream qt bug?
>
> >
> > greetings
> >
> > Am Sonntag, den 15.12.2013, 10:01 +0100 schrieb
> > christopher.l...@thurweb.ch:
> >> Hi Hendrik
> >>
> >> Have you seen this? http://qt-project.org/wiki/Performance_tip_Lists
> >>
> >> The general advice is to keep the delegates is lightweight as
> >> possible, and to use Loaders for anything needed later (e.g. onClick)
> >>
> >> Chris
> >>
> >> Zitat von "Hendrik Borghorst" <hendrikborgho...@gmail.com>:
> >>
> >>> Hello folks,
> >>>
> >>> I've got a problem with long lists (~25000 elements). All delegates are
> >>> created at once which causes the memory usage to explode beyond the
> >>> devices capability.
> >>>
> >>> I already tried setting "cacheBuffer: 0" in SiliciaListView but  it
> >>> doesn't change it.
> >>>
> >>> Is the something I'm doing wrong.
> >>>
> >>> You can see the actual page code here:
> >>>
> >>> https://github.com/djselbeck/smpc/blob/master/pages/CurrentPlaylistPage.qml
> >>>
> >>> Shouldn't the delegates be constructed on demand? It is weird because my
> >>> old n8 wasn't struggling with qml lists with this size.
> >>>
> >>> greetings and congrats on getting the devices to your customers (I'm
> >>> very pleased)
> >>>
> >>
> >>
> >>
> >>
> >
> > _______________________________________________
> > SailfishOS.org Devel mailing list
>
> _______________________________________________
> SailfishOS.org Devel mailing list

_______________________________________________
SailfishOS.org Devel mailing list

Reply via email to