diff --git a/packages/component-base/src/virtualizer-iron-list-adapter.js b/packages/component-base/src/virtualizer-iron-list-adapter.js index 6b08acad1b..d4774efc0f 100644 --- a/packages/component-base/src/virtualizer-iron-list-adapter.js +++ b/packages/component-base/src/virtualizer-iron-list-adapter.js @@ -272,6 +272,8 @@ export class IronListAdapter { if (!el.hidden) { el.__virtualIndex = vidx + (this._vidxOffset || 0); this.__updateElement(el, el.__virtualIndex); + } else { + delete el.__lastUpdatedIndex; } }, itemSet); } diff --git a/packages/component-base/test/virtualizer.test.js b/packages/component-base/test/virtualizer.test.js index 547ca10654..b87fe534c6 100644 --- a/packages/component-base/test/virtualizer.test.js +++ b/packages/component-base/test/virtualizer.test.js @@ -224,6 +224,28 @@ describe('virtualizer', () => { expect(firstIndexUpdatesCount).to.equal(1); }); + it('should re-render an unhidden item', async () => { + // Create a virtualizer with just one item (rendered content "foo-0") + let prefix = 'foo-'; + const updateElement = (el, index) => (el.textContent = `${prefix}${index}`); + init({ size: 1, updateElement }); + + // Wait for a possible resize observer flush + await aTimeout(100); + + // Reduce the size to 0 (the item gets hidden) + virtualizer.size = 0; + + // Update the prefix used by the renderer to "bar-" + prefix = 'bar-'; + + // Increase the size back to 1 + virtualizer.size = 1; + + // Expect the unhidden item to be re-rendered with the new prefix even though its index hasn't changed + expect(elementsContainer.firstElementChild.textContent).to.equal('bar-0'); + }); + it('should have physical items once visible', async () => { init({ size: 0 }); // Wait for possibly active resize observers to flush