@@ -285,7 +285,7 @@ void ListViewWithPageHeader::setSectionDelegate(QQmlComponent *delegate)
285285
286286 m_sectionDelegate = delegate;
287287
288− m_topSectionItem = getSectionItem(QString());
288+ m_topSectionItem = getSectionItem(QString(), false /*watchGeometry*/);
289289 m_topSectionItem->setZ(3);
290290 QQuickItemPrivate::get(m_topSectionItem)->setCulled(true);
291291 connect(m_topSectionItem, &QQuickItem::heightChanged, this, &ListViewWithPageHeader::stickyHeaderHeightChanged);
@@ -705,8 +705,10 @@ void ListViewWithPageHeader::reallyReleaseItem(ListItem *listItem)
705705
706706void ListViewWithPageHeader::releaseItem(ListItem *listItem)
707707{
708− QQuickItemPrivate *itemPrivate = QQuickItemPrivate::get(listItem->m_item);
709− itemPrivate->removeItemChangeListener(this, QQuickItemPrivate::Geometry);
708+ QQuickItemPrivate::get(listItem->m_item)->removeItemChangeListener(this, QQuickItemPrivate::Geometry);
709+ if (listItem->sectionItem()) {
710+ QQuickItemPrivate::get(listItem->sectionItem())->removeItemChangeListener(this, QQuickItemPrivate::Geometry);
711+ }
710712 m_itemsToRelease << listItem;
711713}
712714
@@ -749,7 +751,7 @@ QQuickItem *ListViewWithPageHeader::getSectionItem(int modelIndex, bool alreadyI
749751 return getSectionItem(section);
750752}
751753
752−QQuickItem *ListViewWithPageHeader::getSectionItem(const QString §ionText)
754+QQuickItem *ListViewWithPageHeader::getSectionItem(const QString §ionText, bool watchGeometry)
753755{
754756 QQuickItem *sectionItem = nullptr;
755757
@@ -773,7 +775,9 @@ QQuickItem *ListViewWithPageHeader::getSectionItem(const QString §ionText)
773775 }
774776 m_sectionDelegate->completeCreate();
775777
776− // TODO attach to sectionItem so we can accomodate to it changing its height
778+ if (watchGeometry) {
779+ QQuickItemPrivate::get(sectionItem)->addItemChangeListener(this, QQuickItemPrivate::Geometry);
780+ }
777781
778782 return sectionItem;
779783}
@@ -1131,15 +1135,23 @@ void ListViewWithPageHeader::contentYAnimationRunningChanged(bool running)
11311135 }
11321136}
11331137
1134−void ListViewWithPageHeader::itemGeometryChanged(QQuickItem * /*item*/, const QRectF &newGeometry, const QRectF &oldGeometry)
1138+void ListViewWithPageHeader::itemGeometryChanged(QQuickItem *item, const QRectF &newGeometry, const QRectF &oldGeometry)
11351139{
11361140 const qreal heightDiff = newGeometry.height() - oldGeometry.height();
11371141 if (heightDiff != 0) {
1138− if (!m_inContentHeightKeepHeaderShown && oldGeometry.y() + oldGeometry.height() + m_clipItem->y() <= contentY() && !m_visibleItems.isEmpty()) {
1142+ if (!m_visibleItems.isEmpty()) {
11391143 ListItem *firstItem = m_visibleItems.first();
1140− firstItem->setY(firstItem->y() - heightDiff);
1141− adjustMinYExtent();
1142− layout();
1144+ const auto prevFirstItemY = firstItem->y();
1145+ if (!m_inContentHeightKeepHeaderShown && oldGeometry.y() + oldGeometry.height() + m_clipItem->y() <= contentY()) {
1146+ firstItem->setY(firstItem->y() - heightDiff);
1147+ } else if (item == firstItem->sectionItem()) {
1148+ firstItem->setY(firstItem->y() + heightDiff);
1149+ }
1150+
1151+ if (firstItem->y() != prevFirstItemY) {
1152+ adjustMinYExtent();
1153+ layout();
1154+ }
11431155 }
11441156 refill();
11451157 adjustMinYExtent();