Skip to content

Commit 406f8ee

Browse files
authored
Merge pull request #14 from Redth/perf-improvements
Perf Improvements & Consistency
2 parents a1bb44a + bbf31a3 commit 406f8ee

File tree

7 files changed

+92
-77
lines changed

7 files changed

+92
-77
lines changed

VirtualListView/Apple/CvCell.ios.maccatalyst.cs

Lines changed: 26 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
using CoreGraphics;
22
using Foundation;
33
using Microsoft.Maui.Platform;
4+
using Microsoft.VisualBasic;
45
using System.Diagnostics.CodeAnalysis;
56
using UIKit;
67

@@ -12,7 +13,7 @@ internal class CvCell : UICollectionViewCell
1213

1314
public WeakReference<NSIndexPath> IndexPath { get; set; }
1415

15-
public PositionInfo PositionInfo { get; set; }
16+
public PositionInfo PositionInfo { get; private set; }
1617

1718
public WeakReference<Action<IView>> ReuseCallback { get; set; }
1819

@@ -91,7 +92,10 @@ public override UICollectionViewLayoutAttributes PreferredLayoutAttributesFittin
9192
}
9293

9394
public bool NeedsView
94-
=> NativeView == null || !NativeView.TryGetTarget(out var _);
95+
=> NativeView == null
96+
|| VirtualView is null
97+
|| !NativeView.TryGetTarget(out var _)
98+
|| !VirtualView.TryGetTarget(out var _);
9599

96100
public WeakReference<IView> VirtualView { get; set; }
97101

@@ -109,31 +113,33 @@ public override void PrepareForReuse()
109113
}
110114
}
111115

112-
public void SwapView(IView newView)
116+
public void SetupView(IView view)
113117
{
114118
// Create a new platform native view if we don't have one yet
115-
if (!(NativeView?.TryGetTarget(out var nativeView) ?? false))
119+
if (!(NativeView?.TryGetTarget(out var _) ?? false))
116120
{
117-
nativeView = newView.ToPlatform(this.Handler.MauiContext);
121+
var nativeView = view.ToPlatform(this.Handler.MauiContext);
118122
nativeView.Frame = this.ContentView.Frame;
119123
nativeView.AutoresizingMask = UIViewAutoresizing.FlexibleHeight | UIViewAutoresizing.FlexibleWidth;
120-
this.ContentView.AddSubview(nativeView);
121-
NativeView = new WeakReference<UIView>(nativeView);
124+
125+
this.ContentView.AddSubview(nativeView);
126+
127+
NativeView = new WeakReference<UIView>(nativeView);
122128
}
123129

124-
// Create a new virtual view if we don't have one yet
125-
if (!(VirtualView?.TryGetTarget(out var virtualView) ?? false) || (virtualView?.Handler is null))
126-
{
127-
virtualView = newView;
128-
VirtualView = new WeakReference<IView>(virtualView);
129-
}
130-
else
130+
if (!(VirtualView?.TryGetTarget(out var virtualView) ?? false) || (virtualView?.Handler is null))
131+
{
132+
VirtualView = new WeakReference<IView>(view);
133+
}
134+
}
135+
136+
public void UpdatePosition(PositionInfo positionInfo)
137+
{
138+
PositionInfo = positionInfo;
139+
if (VirtualView?.TryGetTarget(out var virtualView) ?? false)
131140
{
132-
var handler = virtualView.Handler;
133-
virtualView.Handler = null;
134-
newView.Handler = handler;
135-
handler.SetVirtualView(newView);
136-
VirtualView.SetTarget(newView);
137-
}
141+
if (virtualView is IPositionInfo viewPositionInfo)
142+
viewPositionInfo.Update(positionInfo);
143+
}
138144
}
139145
}

VirtualListView/Apple/CvDataSource.ios.maccatalyst.cs

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -58,16 +58,13 @@ public override UICollectionViewCell GetCell(UICollectionView collectionView, NS
5858
if (cell.NeedsView)
5959
{
6060
var view = Handler?.PositionalViewSelector?.ViewSelector?.CreateView(info, data);
61-
cell.SwapView(view);
61+
cell.SetupView(view);
6262
}
6363

64-
cell.PositionInfo = info;
64+
cell.UpdatePosition(info);
6565

6666
if (cell.VirtualView.TryGetTarget(out var cellVirtualView))
6767
{
68-
if (cellVirtualView is IPositionInfo viewPositionInfo)
69-
viewPositionInfo.IsSelected = info.IsSelected;
70-
7168
Handler?.PositionalViewSelector?.ViewSelector?.RecycleView(info, data, cellVirtualView);
7269

7370
Handler.VirtualView.ViewSelector.ViewAttached(info, cellVirtualView);

VirtualListView/Platforms/Android/RvAdapter.cs

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -75,11 +75,15 @@ public override void OnBindViewHolder(RecyclerView.ViewHolder holder, int positi
7575
_ => null
7676
};
7777

78-
var view = itemHolder?.VirtualView ?? positionalViewSelector?.ViewSelector?.CreateView(info, data);
78+
if (itemHolder.NeedsView)
79+
{
80+
var newView = positionalViewSelector?.ViewSelector?.CreateView(info, data);
81+
itemHolder.SetupView(newView);
82+
}
7983

80-
itemHolder.Update(info, view);
84+
itemHolder.UpdatePosition(info);
8185

82-
positionalViewSelector?.ViewSelector?.RecycleView(info, data, itemHolder.ViewContainer.VirtualView);
86+
positionalViewSelector?.ViewSelector?.RecycleView(info, data, itemHolder.ViewContainer.VirtualView);
8387
}
8488
}
8589

VirtualListView/Platforms/Android/RvItemHolder.cs

Lines changed: 19 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using Android.Views;
22
using AndroidX.RecyclerView.Widget;
3+
using Microsoft.Maui.Controls;
34

45
namespace Microsoft.Maui;
56

@@ -22,18 +23,27 @@ public RvItemHolder(IMauiContext mauiContext, ListOrientation orientation)
2223
public IView VirtualView
2324
=> ViewContainer?.VirtualView;
2425

25-
public void Update(PositionInfo positionInfo, IView newView)
26-
{
27-
PositionInfo = positionInfo;
26+
public bool NeedsView
27+
=> ViewContainer?.NeedsView ?? true;
2828

29-
if (newView is IPositionInfo viewWithPositionInfo)
30-
viewWithPositionInfo.Update(PositionInfo);
31-
32-
SwapView(newView);
29+
public void SetupView(IView view)
30+
{
31+
ViewContainer.SetupView(view);
3332
}
3433

35-
void SwapView(IView view)
34+
public void UpdatePosition(PositionInfo positionInfo)
3635
{
37-
ViewContainer.SwapView(view);
36+
PositionInfo = positionInfo;
37+
ViewContainer.UpdatePosition(positionInfo);
3838
}
39+
40+
//public void Update(PositionInfo positionInfo, IView newView)
41+
//{
42+
// PositionInfo = positionInfo;
43+
44+
// if (newView is IPositionInfo viewWithPositionInfo)
45+
// viewWithPositionInfo.Update(PositionInfo);
46+
47+
// ViewContainer.SwapView(newView);
48+
// }
3949
}

VirtualListView/Platforms/Android/RvViewContainer.cs

Lines changed: 15 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -18,20 +18,23 @@ public RvViewContainer(IMauiContext context)
1818

1919
public AView NativeView { get; private set; }
2020

21-
public void SwapView(IView newView)
21+
public bool NeedsView => VirtualView is null || VirtualView.Handler is null || NativeView is null;
22+
23+
public void UpdatePosition(IPositionInfo positionInfo)
24+
{
25+
if (VirtualView is IPositionInfo viewWithPositionInfo)
26+
viewWithPositionInfo.Update(positionInfo);
27+
}
28+
29+
public void SetupView(IView view)
2230
{
23-
if (VirtualView == null || VirtualView.Handler == null || NativeView == null)
31+
if (NativeView is null)
32+
NativeView = view.ToPlatform(MauiContext);
33+
34+
if (VirtualView is null)
2435
{
25-
NativeView = newView.ToPlatform(MauiContext);
26-
VirtualView = newView;
36+
VirtualView = view;
2737
AddView(NativeView);
2838
}
29-
else
30-
{
31-
var handler = VirtualView.Handler;
32-
newView.Handler = handler;
33-
handler.SetVirtualView(newView);
34-
VirtualView = newView;
35-
}
36-
}
39+
}
3740
}

VirtualListView/Platforms/Windows/IrElementContainer.cs

Lines changed: 15 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -48,33 +48,27 @@ internal bool IsRecycled
4848
}
4949
}
5050

51+
public bool NeedsView
52+
=> VirtualView is null || VirtualView.Handler is null;
53+
5154
public IView VirtualView { get; private set; }
5255

53-
public void Update(PositionInfo positionInfo, IView newView)
56+
public void SetupView(IView view)
5457
{
55-
PositionInfo = positionInfo;
56-
57-
if (newView is IPositionInfo viewWithPositionInfo)
58-
viewWithPositionInfo.Update(PositionInfo);
59-
60-
SwapView(newView);
58+
if (VirtualView is null || VirtualView.Handler is null)
59+
{
60+
Content = view.ToPlatform(MauiContext);
61+
VirtualView = view;
62+
}
6163
}
6264

63-
void SwapView(IView newView)
65+
public void UpdatePosition(PositionInfo positionInfo)
6466
{
65-
if (VirtualView == null || VirtualView.Handler == null || Content == null)
66-
{
67-
Content = newView.ToPlatform(MauiContext);
68-
VirtualView = newView;
69-
}
70-
else
71-
{
72-
var handler = VirtualView.Handler;
73-
newView.Handler = handler;
74-
handler.SetVirtualView(newView);
75-
VirtualView = newView;
76-
}
77-
}
67+
PositionInfo = positionInfo;
68+
69+
if (VirtualView is IPositionInfo viewWithPositionInfo)
70+
viewWithPositionInfo.Update(PositionInfo);
71+
}
7872

7973
protected override void OnTapped(TappedRoutedEventArgs e)
8074
{

VirtualListView/Platforms/Windows/IrElementFactory.cs

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -85,16 +85,17 @@ public UIElement GetElement(UI.Xaml.ElementFactoryGetArgs args)
8585
&& (Handler?.IsItemSelected(info.SectionIndex, info.ItemIndex) ?? false);
8686

8787

88-
var view = container.VirtualView ?? PositionalViewSelector.ViewSelector?.CreateView(info, data);
89-
90-
container.Update(info, view);
91-
92-
88+
if (container.NeedsView)
89+
{
90+
var virtualView = PositionalViewSelector.ViewSelector?.CreateView(info, data);
91+
container.SetupView(virtualView);
92+
}
9393

94+
container.UpdatePosition(info);
9495
container.IsRecycled = false;
95-
PositionalViewSelector.ViewSelector?.RecycleView(info, data, view);
9696

97-
PositionalViewSelector.ViewSelector?.ViewAttached(info, view);
97+
PositionalViewSelector.ViewSelector?.RecycleView(info, data, container.VirtualView);
98+
PositionalViewSelector.ViewSelector?.ViewAttached(info, container.VirtualView);
9899

99100
return container;
100101
}

0 commit comments

Comments
 (0)