@@ -286,7 +286,7 @@ void ListViewWithPageHeader::setSectionDelegate(QQmlComponent *delegate)
286286
287287 m_sectionDelegate = delegate;
288288
289− m_topSectionItem = getSectionItem(QString());
289+ m_topSectionItem = getSectionItem(QString(), false /*watchGeometry*/);
290290 m_topSectionItem->setZ(3);
291291 QQuickItemPrivate::get(m_topSectionItem)->setCulled(true);
292292 connect(m_topSectionItem, &QQuickItem::heightChanged, this, &ListViewWithPageHeader::stickyHeaderHeightChanged);
@@ -701,8 +701,10 @@ void ListViewWithPageHeader::reallyReleaseItem(ListItem *listItem)
701701
702702void ListViewWithPageHeader::releaseItem(ListItem *listItem)
703703{
704− QQuickItemPrivate *itemPrivate = QQuickItemPrivate::get(listItem->m_item);
705− itemPrivate->removeItemChangeListener(this, QQuickItemPrivate::Geometry);
704+ QQuickItemPrivate::get(listItem->m_item)->removeItemChangeListener(this, QQuickItemPrivate::Geometry);
705+ if (listItem->sectionItem()) {
706+ QQuickItemPrivate::get(listItem->sectionItem())->removeItemChangeListener(this, QQuickItemPrivate::Geometry);
707+ }
706708 m_itemsToRelease << listItem;
707709}
708710
@@ -745,7 +747,7 @@ QQuickItem *ListViewWithPageHeader::getSectionItem(int modelIndex, bool alreadyI
745747 return getSectionItem(section);
746748}
747749
748−QQuickItem *ListViewWithPageHeader::getSectionItem(const QString §ionText)
750+QQuickItem *ListViewWithPageHeader::getSectionItem(const QString §ionText, bool watchGeometry)
749751{
750752 QQuickItem *sectionItem = nullptr;
751753
@@ -769,7 +771,9 @@ QQuickItem *ListViewWithPageHeader::getSectionItem(const QString §ionText)
769771 }
770772 m_sectionDelegate->completeCreate();
771773
772− // TODO attach to sectionItem so we can accomodate to it changing its height
774+ if (watchGeometry) {
775+ QQuickItemPrivate::get(sectionItem)->addItemChangeListener(this, QQuickItemPrivate::Geometry);
776+ }
773777
774778 return sectionItem;
775779}
@@ -1125,15 +1129,23 @@ void ListViewWithPageHeader::contentYAnimationRunningChanged(bool running)
11251129 }
11261130}
11271131
1128−void ListViewWithPageHeader::itemGeometryChanged(QQuickItem * /*item*/, const QRectF &newGeometry, const QRectF &oldGeometry)
1132+void ListViewWithPageHeader::itemGeometryChanged(QQuickItem *item, const QRectF &newGeometry, const QRectF &oldGeometry)
11291133{
11301134 const qreal heightDiff = newGeometry.height() - oldGeometry.height();
11311135 if (heightDiff != 0) {
1132− if (!m_inContentHeightKeepHeaderShown && oldGeometry.y() + oldGeometry.height() + m_clipItem->y() <= contentY() && !m_visibleItems.isEmpty()) {
1136+ if (!m_visibleItems.isEmpty()) {
11331137 ListItem *firstItem = m_visibleItems.first();
1134− firstItem->setY(firstItem->y() - heightDiff);
1135− adjustMinYExtent();
1136− layout();
1138+ const auto prevFirstItemY = firstItem->y();
1139+ if (!m_inContentHeightKeepHeaderShown && oldGeometry.y() + oldGeometry.height() + m_clipItem->y() <= contentY()) {
1140+ firstItem->setY(firstItem->y() - heightDiff);
1141+ } else if (item == firstItem->sectionItem()) {
1142+ firstItem->setY(firstItem->y() + heightDiff);
1143+ }
1144+
1145+ if (firstItem->y() != prevFirstItemY) {
1146+ adjustMinYExtent();
1147+ layout();
1148+ }
11371149 }
11381150 refill();
11391151 adjustMinYExtent();