diff --git a/Terminal.Gui/Views/ListView.cs b/Terminal.Gui/Views/ListView.cs
index e0d4edbda..ae6528d94 100644
--- a/Terminal.Gui/Views/ListView.cs
+++ b/Terminal.Gui/Views/ListView.cs
@@ -601,10 +601,12 @@ namespace Terminal.Gui {
///
public virtual bool MoveEnd ()
{
- if (source.Count > 0 && selected != source.Count - 1) {
+ if (source?.Count > 0 && selected != source.Count - 1) {
selected = source.Count - 1;
if (top + selected > Frame.Height - 1) {
- top = selected;
+ top = selected < Frame.Height - 1
+ ? Math.Max (Frame.Height - selected + 1, 0)
+ : Math.Max (selected - Frame.Height + 1, 0);
}
OnSelectedChanged ();
SetNeedsDisplay ();
@@ -749,6 +751,11 @@ namespace Terminal.Gui {
public void EnsureSelectedItemVisible ()
{
SuperView?.LayoutSubviews ();
+ // If last item is selected and is removed, ensures a valid selected item
+ if (Source != null && selected > Source.Count - 1) {
+ SelectedItem = Source.Count - 1;
+ SetNeedsDisplay ();
+ }
if (selected < top) {
top = selected;
} else if (Frame.Height > 0 && selected >= top + Frame.Height) {
@@ -831,11 +838,30 @@ namespace Terminal.Gui {
}
///
- public int Count => src != null ? src.Count : 0;
+ public int Count {
+ get {
+ CheckAndResizeMarksIfRequired ();
+ return src?.Count ?? 0;
+ }
+ }
///
public int Length => len;
+ void CheckAndResizeMarksIfRequired ()
+ {
+ if (src != null && count != src.Count) {
+ count = src.Count;
+ BitArray newMarks = new BitArray (count);
+ for (var i = 0; i < Math.Min (marks.Length, newMarks.Length); i++) {
+ newMarks [i] = marks [i];
+ }
+ marks = newMarks;
+
+ len = GetMaxLengthItem ();
+ }
+ }
+
int GetMaxLengthItem ()
{
if (src == null || src?.Count == 0) {
@@ -896,7 +922,7 @@ namespace Terminal.Gui {
///
public bool IsMarked (int item)
{
- if (item >= 0 && item < count)
+ if (item >= 0 && item < Count)
return marks [item];
return false;
}
@@ -904,7 +930,7 @@ namespace Terminal.Gui {
///
public void SetMark (int item, bool value)
{
- if (item >= 0 && item < count)
+ if (item >= 0 && item < Count)
marks [item] = value;
}
diff --git a/UnitTests/Views/ListViewTests.cs b/UnitTests/Views/ListViewTests.cs
index f705dab25..1f6589204 100644
--- a/UnitTests/Views/ListViewTests.cs
+++ b/UnitTests/Views/ListViewTests.cs
@@ -300,16 +300,16 @@ namespace Terminal.Gui.ViewTests {
Assert.Equal (19, lv.SelectedItem);
TestHelpers.AssertDriverContentsWithFrameAre (@"
┌──────────┐
+│Line10 │
+│Line11 │
+│Line12 │
+│Line13 │
+│Line14 │
+│Line15 │
+│Line16 │
+│Line17 │
+│Line18 │
│Line19 │
-│ │
-│ │
-│ │
-│ │
-│ │
-│ │
-│ │
-│ │
-│ │
└──────────┘", output);
Assert.True (lv.ScrollUp (20));