I have a QML application with a ScrollView and a ListView inside. The items from the ListView have variable heights.
I need to know when the scroll bar is moved, in fact, when it is at the bottom and when it is not. My target is to keep the scroll bar at the bottom (positionViewAtEnd()
) when I add an item to the ListView only if the scroll is at the bottom. If not at the bottom, positionViewAtEnd()
will not be used.
I have tried "playing" with the height
, contentHeight
, and contentY
. Sometimes it works (when scroll is at bottom: contentHeight == contentY + height
), but other times, contentY
value changes to negative values, and my code fails.
How do I achieve this?
I have tried with atYEnd
in several property changes, to detect if the scroll bar is at the bottom or not.
It seems to work, and then I use that in onCountChanged
to put (or not) the scroll bar at the bottom.
That works once all the ListView height is full of messages, but not in one case: when the incoming message is the one that fills the ListView height (1st time that contentY
is not0
).
I have simplified my code to test (including the delegate):
FocusScope { clip: true id: focusScopeView width: parent.width; height: parent.height ScrollView { width: parent.width; height: parent.height ListView { id: listTexts width: parent.width; height: parent.height property bool bScrolled: false model: textsModel delegate: Text { text: "Contact:\t" + eventText } onCountChanged: { if (!bScrolled) positionViewAtEnd(); } onContentYChanged: { bScrolled = !atYEnd; if (atYEnd) positionViewAtEnd() } onContentHeightChanged: { if (!bScrolled) positionViewAtEnd(); } } }}