@@ -700,8 +700,10 @@ void ListViewWithPageHeader::reallyReleaseItem(ListItem *listItem)
701void ListViewWithPageHeader::releaseItem(ListItem *listItem)
701void ListViewWithPageHeader::releaseItem(ListItem *listItem)
703− QQuickItemPrivate *itemPrivate = QQuickItemPrivate::get(listItem->m_item);
703+ QQuickItemPrivate::get(listItem->m_item)->removeItemChangeListener(this, QQuickItemPrivate::Geometry);
704+ if (listItem->sectionItem()) {
704− itemPrivate->removeItemChangeListener(this, QQuickItemPrivate::Geometry);
705+ QQuickItemPrivate::get(listItem->sectionItem())->removeItemChangeListener(this, QQuickItemPrivate::Geometry);
705 m_itemsToRelease << listItem;
707 m_itemsToRelease << listItem;
@@ -768,7 +770,7 @@ QQuickItem *ListViewWithPageHeader::getSectionItem(const QString §ionText)
769 m_sectionDelegate->completeCreate();
771 m_sectionDelegate->completeCreate();
771− // TODO attach to sectionItem so we can accomodate to it changing its height
773+ QQuickItemPrivate::get(sectionItem)->addItemChangeListener(this, QQuickItemPrivate::Geometry);
773 return sectionItem;
775 return sectionItem;
@@ -1126,15 +1128,23 @@ void ListViewWithPageHeader::contentYAnimationRunningChanged(bool running)
1129−void ListViewWithPageHeader::itemGeometryChanged(QQuickItem * /*item*/, const QRectF &newGeometry, const QRectF &oldGeometry)
1131+void ListViewWithPageHeader::itemGeometryChanged(QQuickItem *item, const QRectF &newGeometry, const QRectF &oldGeometry)
1131 const qreal heightDiff = newGeometry.height() - oldGeometry.height();
1133 const qreal heightDiff = newGeometry.height() - oldGeometry.height();
1132 if (heightDiff != 0) {
1134 if (heightDiff != 0) {
1133− if (!m_inContentHeightKeepHeaderShown && oldGeometry.y() + oldGeometry.height() + m_clipItem->y() <= contentY() && !m_visibleItems.isEmpty()) {
1135+ if (!m_visibleItems.isEmpty()) {
1134 ListItem *firstItem = m_visibleItems.first();
1136 ListItem *firstItem = m_visibleItems.first();
1137+ const auto prevFirstItemY = firstItem->y();
1138+ if (item == firstItem->sectionItem()) {
1139+ firstItem->setY(firstItem->y() + heightDiff);
1140+ } else if (!m_inContentHeightKeepHeaderShown && oldGeometry.y() + oldGeometry.height() + m_clipItem->y() <= contentY()) {
1135− firstItem->setY(firstItem->y() - heightDiff);
1141+ firstItem->setY(firstItem->y() - heightDiff);
1144+ if (firstItem->y() != prevFirstItemY) {
1136− adjustMinYExtent();
1145+ adjustMinYExtent();
1137− layout();
1146+ layout();
1139 refill();
1149 refill();
1140 adjustMinYExtent();
1150 adjustMinYExtent();