Skip to content

Commit 23f83cc

Browse files
committed
2 parents 2734c19 + 4abec86 commit 23f83cc

File tree

8 files changed

+37
-22
lines changed

8 files changed

+37
-22
lines changed

Sample/VirtualListViewSample/MainViewModel.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,11 @@ public MainViewModel()
1515
MusicDataAdapter adapter;
1616

1717
[RelayCommand]
18-
async Task Refresh()
18+
async Task Refresh(Action completion)
1919
{
2020
await Task.Delay(3000);
21+
System.Diagnostics.Debug.WriteLine("Refresh Complete");
22+
completion?.Invoke();
2123
}
2224

2325
[RelayCommand]

VirtualListView/Apple/VirtualListViewHandler.ios.maccatalyst.cs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,9 +39,7 @@ protected override UICollectionView CreatePlatformView()
3939
refreshControl.AddTarget(new EventHandler((s, a) =>
4040
{
4141
refreshControl.BeginRefreshing();
42-
VirtualView?.Refresh();
43-
refreshControl.EndRefreshing();
44-
42+
VirtualView?.Refresh(() => refreshControl.EndRefreshing());
4543
}), UIControlEvent.ValueChanged);
4644

4745
collectionView.AddSubview(refreshControl);

VirtualListView/Controls/VirtualListView.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -111,16 +111,16 @@ public Maui.SelectionMode SelectionMode
111111

112112
public event EventHandler<SelectedItemsChangedEventArgs> OnSelectedItemsChanged;
113113

114-
public event EventHandler<EventArgs> OnRefresh;
114+
public event EventHandler<RefreshEventArgs> OnRefresh;
115115

116-
void IVirtualListView.Refresh()
116+
void IVirtualListView.Refresh(Action completionCallback)
117117
{
118118
if (RefreshCommand != null && RefreshCommand.CanExecute(null))
119119
{
120-
RefreshCommand.Execute(null);
120+
RefreshCommand.Execute(completionCallback);
121121
}
122122

123-
OnRefresh?.Invoke(this, EventArgs.Empty);
123+
OnRefresh?.Invoke(this, new RefreshEventArgs(completionCallback));
124124
}
125125

126126
public ICommand RefreshCommand

VirtualListView/IVirtualListView.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ public interface IVirtualListView : IView
2626

2727
Color RefreshAccentColor { get; }
2828

29-
void Refresh();
29+
void Refresh(Action completionCallback);
3030

3131
bool IsRefreshEnabled { get; }
3232

VirtualListView/Platforms/Android/RvAdapter.cs

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@ public override int ItemCount
2424
internal RvAdapter(Context context, VirtualListViewHandler handler, PositionalViewSelector positionalViewSelector)
2525
{
2626
Context = context;
27+
HasStableIds = false;
28+
2729
this.handler = handler;
2830
this.positionalViewSelector = positionalViewSelector;
2931
}
@@ -79,7 +81,8 @@ public override void OnBindViewHolder(RecyclerView.ViewHolder holder, int positi
7981
}
8082
}
8183

82-
List<string> cachedReuseIds = new List<string>();
84+
Dictionary<string, int> cachedReuseIds = new ();
85+
int reuseIdCount = 100;
8386

8487
public override int GetItemViewType(int position)
8588
{
@@ -103,19 +106,20 @@ public override int GetItemViewType(int position)
103106

104107
lock (lockObj)
105108
{
106-
vt = cachedReuseIds.IndexOf(reuseId) + 1;
107-
if (vt <= 0)
109+
if (!cachedReuseIds.TryGetValue(reuseId, out var reuseIdNumber))
108110
{
109-
cachedReuseIds.Add(reuseId);
110-
vt = cachedReuseIds.Count;
111+
reuseIdNumber = ++reuseIdCount;
112+
cachedReuseIds.Add(reuseId, reuseIdNumber);
111113
}
114+
115+
vt = reuseIdNumber;
112116
}
113117

114118
return vt;
115119
}
116120

117121
public override long GetItemId(int position)
118-
=> position;
122+
=> RecyclerView.NoId;
119123

120124
public override RecyclerView.ViewHolder OnCreateViewHolder(ViewGroup parent, int viewType)
121125
{
@@ -146,9 +150,9 @@ public override RecyclerView.ViewHolder OnCreateViewHolder(ViewGroup parent, int
146150

147151
public void Reset()
148152
{
149-
lock (lockObj)
150-
{
151-
cachedReuseIds.Clear();
152-
}
153+
//lock (lockObj)
154+
//{
155+
// cachedReuseIds.Clear();
156+
//}
153157
}
154158
}

VirtualListView/Platforms/Android/VirtualListViewHandler.android.cs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,7 @@ protected override void ConnectHandler(FrameLayout nativeView)
3737
{
3838
swipeRefreshLayout.SetOnRefreshListener(new SrlRefreshListener(() =>
3939
{
40-
VirtualView?.Refresh();
41-
swipeRefreshLayout.Refreshing = false;
40+
VirtualView?.Refresh(() => swipeRefreshLayout.Refreshing = false);
4241
}));
4342

4443
layoutManager = new LinearLayoutManager(Context);

VirtualListView/RefreshEventArgs.cs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
namespace Microsoft.Maui;
2+
3+
public class RefreshEventArgs : EventArgs
4+
{
5+
public RefreshEventArgs(Action completion)
6+
: base()
7+
{
8+
Complete = completion;
9+
}
10+
11+
public readonly Action Complete;
12+
}

VirtualListView/SelectedItemsChangedEventArgs.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,4 +14,4 @@ public SelectedItemsChangedEventArgs(
1414
public IReadOnlyList<ItemPosition> PreviousSelection { get; }
1515

1616
public IReadOnlyList<ItemPosition> NewSelection { get; }
17-
}
17+
}

0 commit comments

Comments
 (0)