[iOS/Android] Handle item selection highlight when ListView cell is tapped erraticall...
authoradrianknight89 <adrianknight89@outlook.com>
Mon, 6 Feb 2017 11:59:11 +0000 (05:59 -0600)
committerRui Marinho <me@ruimarinho.net>
Mon, 6 Feb 2017 11:59:11 +0000 (11:59 +0000)
* Fix multi tap selection highlight

* added sample code

* add ios fix

Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla32956.cs [new file with mode: 0644]
Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Xamarin.Forms.Controls.Issues.Shared.projitems
Xamarin.Forms.Platform.Android/Renderers/ListViewAdapter.cs
Xamarin.Forms.Platform.iOS/Renderers/ListViewRenderer.cs

diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla32956.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla32956.cs
new file mode 100644 (file)
index 0000000..b1baafe
--- /dev/null
@@ -0,0 +1,48 @@
+using System.Collections.Generic;
+using Xamarin.Forms.CustomAttributes;
+using Xamarin.Forms.Internals;
+using System.Threading.Tasks;
+
+#if UITEST
+using Xamarin.UITest;
+using NUnit.Framework;
+#endif
+
+namespace Xamarin.Forms.Controls
+{
+       [Preserve(AllMembers = true)]
+       [Issue(IssueTracker.Bugzilla, 32956, "Setting ListView.SelectedItem to null does not remove list item highlight when list item is tapped multiple times quickly", PlatformAffected.Android | PlatformAffected.iOS)]
+       public class Bugzilla32956 : TestNavigationPage
+       {
+               protected override void Init()
+               {
+                       var list = new List<int>();
+                       for(var i=0; i<10; i++)
+                               list.Add(i);
+
+                       var listView = new ListView
+                       {
+                               ItemsSource = list
+                       };
+                       listView.ItemSelected += async (sender, args) =>
+                       {
+                               if (args.SelectedItem == null)
+                                       return;
+
+                               await Task.Delay(1000);
+                               await Navigation.PushAsync(new ContentPage());
+                       };
+
+                       var contentPage = new ContentPage
+                       {
+                               Content = listView
+                       };
+                       contentPage.Appearing += (sender, args) =>
+                       {
+                               listView.SelectedItem = null;
+                       };
+
+                       PushAsync(contentPage);
+               }
+       }
+}
\ No newline at end of file
index 859f3c0..e55302a 100644 (file)
@@ -58,6 +58,7 @@
       <SubType>Code</SubType>
     </Compile>
     <Compile Include="$(MSBuildThisFileDirectory)Bugzilla32847.cs" />
+    <Compile Include="$(MSBuildThisFileDirectory)Bugzilla32956.cs" />
     <Compile Include="$(MSBuildThisFileDirectory)Bugzilla33248.cs" />
     <Compile Include="$(MSBuildThisFileDirectory)Bugzilla33268.cs" />
     <Compile Include="$(MSBuildThisFileDirectory)Bugzilla33612.cs" />
index 245c3d7..1ff11f4 100644 (file)
@@ -371,8 +371,9 @@ namespace Xamarin.Forms.Platform.Android
                        if (position < 0 || position >= Count)
                                return;
 
+                       if(_lastSelected != view)
+                               _fromNative = true;
                        Select(position, view);
-                       _fromNative = true;
                        Controller.NotifyRowTapped(position, cell);
                }
 
index 9a6e2cf..be95731 100644 (file)
@@ -914,7 +914,8 @@ namespace Xamarin.Forms.Platform.iOS
 
                                SetCellBackgroundColor(cell, UIColor.Clear);
 
-                               _selectionFromNative = true;
+                               if (!cell.Selected)
+                                       _selectionFromNative = true;
 
                                tableView.EndEditing(true);
                                Controller.NotifyRowTapped(indexPath.Section, indexPath.Row, formsCell);