diff --git a/src/Avalonia.Controls/Presenters/ItemVirtualizerSimple.cs b/src/Avalonia.Controls/Presenters/ItemVirtualizerSimple.cs index 4d0cf4ac3b..26b7ccf65f 100644 --- a/src/Avalonia.Controls/Presenters/ItemVirtualizerSimple.cs +++ b/src/Avalonia.Controls/Presenters/ItemVirtualizerSimple.cs @@ -272,10 +272,8 @@ namespace Avalonia.Controls.Presenters { RecycleContainersForMove(delta); } - else - { - RecycleContainers(); - } + + RecycleContainers(); } } diff --git a/tests/Avalonia.Controls.UnitTests/Presenters/ItemsPresenterTests_Virtualization_Simple.cs b/tests/Avalonia.Controls.UnitTests/Presenters/ItemsPresenterTests_Virtualization_Simple.cs index f409865ada..042060b9f6 100644 --- a/tests/Avalonia.Controls.UnitTests/Presenters/ItemsPresenterTests_Virtualization_Simple.cs +++ b/tests/Avalonia.Controls.UnitTests/Presenters/ItemsPresenterTests_Virtualization_Simple.cs @@ -254,7 +254,7 @@ namespace Avalonia.Controls.UnitTests.Presenters } [Fact] - public void Removing_Items_When_Scrolled_To_End_Should_Add_Containers_At_Top() + public void Removing_Items_When_Scrolled_To_End_Should_Recyle_Containers_At_Top() { var target = CreateTarget(itemCount: 20, useAvaloniaList: true); @@ -277,6 +277,32 @@ namespace Avalonia.Controls.UnitTests.Presenters Assert.Equal(expected, actual); } + [Fact] + public void Removing_Items_When_Scrolled_To_Near_End_Should_Recycle_Containers_At_Bottom_And_Top() + { + var target = CreateTarget(itemCount: 20, useAvaloniaList: true); + + target.ApplyTemplate(); + target.Measure(new Size(100, 100)); + target.Arrange(new Rect(0, 0, 100, 100)); + + ((ILogicalScrollable)target).Offset = new Vector(0, 9); + + var expected = Enumerable.Range(9, 10).Select(x => $"Item {x}").ToList(); + var items = (AvaloniaList)target.Items; + var actual = target.Panel.Children.Select(x => x.DataContext).ToList(); + + Assert.Equal(expected, actual); + + items.RemoveRange(15, 3); + expected = Enumerable.Range(7, 8).Select(x => $"Item {x}") + .Concat(Enumerable.Range(18, 2).Select(x => $"Item {x}")) + .ToList(); + + actual = target.Panel.Children.Select(x => x.DataContext).ToList(); + Assert.Equal(expected, actual); + } + [Fact] public void Setting_Items_To_Null_Should_Remove_Containers() {