From 1fd1da699d09c9f4f5f74ca4c78a3611465a0de8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Javier=20Su=C3=A1rez=20Ruiz?= Date: Thu, 22 Mar 2018 20:16:11 +0100 Subject: [PATCH] Changes in ListViewRenderer to support source collection changes (add, remove, etc) --- Ooui.Forms/Renderers/ListViewRenderer.cs | 33 ++++++++++++++++++-- Samples/ListView/RefreshListView.xaml | 29 ++++++++++++++++++ Samples/ListView/RefreshListView.xaml.cs | 16 ++++++++++ Samples/ListView/RefreshListViewModel.cs | 38 ++++++++++++++++++++++++ Samples/Program.cs | 1 + Samples/RefreshListViewSample.cs | 21 +++++++++++++ Samples/Samples.csproj | 7 +++++ 7 files changed, 142 insertions(+), 3 deletions(-) create mode 100644 Samples/ListView/RefreshListView.xaml create mode 100644 Samples/ListView/RefreshListView.xaml.cs create mode 100644 Samples/ListView/RefreshListViewModel.cs create mode 100644 Samples/RefreshListViewSample.cs diff --git a/Ooui.Forms/Renderers/ListViewRenderer.cs b/Ooui.Forms/Renderers/ListViewRenderer.cs index efaf229..368ae06 100644 --- a/Ooui.Forms/Renderers/ListViewRenderer.cs +++ b/Ooui.Forms/Renderers/ListViewRenderer.cs @@ -1,5 +1,6 @@ using Ooui.Forms.Extensions; using System.Collections.Generic; +using System.Collections.Specialized; using System.ComponentModel; using System.Linq; using Xamarin.Forms; @@ -22,6 +23,12 @@ namespace Ooui.Forms.Renderers protected override void OnElementChanged(ElementChangedEventArgs e) { + if (e.OldElement != null) + { + var templatedItems = TemplatedItemsView.TemplatedItems; + templatedItems.CollectionChanged -= OnCollectionChanged; + } + if (e.NewElement != null) { if (Control == null) @@ -31,7 +38,10 @@ namespace Ooui.Forms.Renderers SetNativeControl(_listView); } - UpdateItems(); + var templatedItems = TemplatedItemsView.TemplatedItems; + templatedItems.CollectionChanged += OnCollectionChanged; + + UpdateItems (); UpdateBackgroundColor(); } @@ -52,13 +62,25 @@ namespace Ooui.Forms.Renderers base.Dispose(disposing); - if (disposing && !_disposed) + if (disposing && !_disposed) { + + if (Element != null) + { + var templatedItems = TemplatedItemsView.TemplatedItems; + templatedItems.CollectionChanged -= OnCollectionChanged; + } + _disposed = true; } } - private void UnsubscribeCellClicks() + private void OnCollectionChanged (object sender, NotifyCollectionChangedEventArgs e) + { + UpdateItems (); + } + + private void UnsubscribeCellClicks() { foreach (var c in _cells) { @@ -71,6 +93,11 @@ namespace Ooui.Forms.Renderers UnsubscribeCellClicks(); _cells.Clear(); + foreach (var child in _listView.Children) + { + _listView.RemoveChild (child); + } + var items = TemplatedItemsView.TemplatedItems; if (!items.Any()) diff --git a/Samples/ListView/RefreshListView.xaml b/Samples/ListView/RefreshListView.xaml new file mode 100644 index 0000000..45eb936 --- /dev/null +++ b/Samples/ListView/RefreshListView.xaml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + +