Skip to content
This repository was archived by the owner on May 1, 2024. It is now read-only.

Commit 22dd496

Browse files
kvptsamhouts
authored andcommitted
[Android] Dispose the collection view item adapter (#6525)
* [Android] Dispose the collection view adapter. * More complete fix.
1 parent 2a31908 commit 22dd496

File tree

1 file changed

+22
-12
lines changed

1 file changed

+22
-12
lines changed

Xamarin.Forms.Platform.Android/CollectionView/ItemsViewRenderer.cs

Lines changed: 22 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ public class ItemsViewRenderer : RecyclerView, IVisualElementRenderer, IEffectCo
1919
readonly EffectControlProvider _effectControlProvider;
2020

2121
protected ItemsViewAdapter ItemsViewAdapter;
22-
22+
2323
int? _defaultLabelFor;
2424
bool _disposed;
2525

@@ -139,7 +139,10 @@ protected override void Dispose(bool disposing)
139139
if (Element != null)
140140
{
141141
TearDownOldElement(Element as ItemsView);
142+
}
142143

144+
if (Element != null)
145+
{
143146
if (Platform.GetRenderer(Element) == this)
144147
{
145148
Element.ClearValue(Platform.RendererProperty);
@@ -215,18 +218,23 @@ protected virtual void UpdateItemsSource()
215218
return;
216219
}
217220

218-
// Stop watching the old adapter to see if it's empty (if we _are_ watching)
219-
Unwatch(ItemsViewAdapter ?? GetAdapter());
220-
221221
UpdateAdapter();
222222

223223
UpdateEmptyView();
224224
}
225225

226226
protected virtual void UpdateAdapter()
227227
{
228+
var oldItemViewAdapter = ItemsViewAdapter;
229+
230+
// Stop watching the old adapter to see if it's empty (if we are watching)
231+
Unwatch(oldItemViewAdapter);
232+
228233
ItemsViewAdapter = new ItemsViewAdapter(ItemsView);
234+
229235
SwapAdapter(ItemsViewAdapter, true);
236+
237+
oldItemViewAdapter?.Dispose();
230238
}
231239

232240
void Unwatch(Adapter adapter)
@@ -281,7 +289,7 @@ protected virtual void SetUpNewElement(ItemsView newElement)
281289

282290
_layout = ItemsView.ItemsLayout;
283291
SetLayoutManager(SelectLayoutManager(_layout));
284-
292+
285293
UpdateSnapBehavior();
286294
UpdateBackgroundColor();
287295
UpdateFlowDirection();
@@ -296,7 +304,7 @@ protected virtual void SetUpNewElement(ItemsView newElement)
296304
// Listen for ScrollTo requests
297305
ItemsView.ScrollToRequested += ScrollToRequested;
298306
}
299-
307+
300308
protected virtual void TearDownOldElement(ItemsView oldElement)
301309
{
302310
if (oldElement == null)
@@ -316,12 +324,13 @@ protected virtual void TearDownOldElement(ItemsView oldElement)
316324
// Stop listening for ScrollTo requests
317325
oldElement.ScrollToRequested -= ScrollToRequested;
318326

319-
var adapter = GetAdapter();
320-
321-
if (adapter != null)
327+
if (ItemsViewAdapter != null)
322328
{
329+
Unwatch(ItemsViewAdapter);
330+
323331
SetAdapter(null);
324-
adapter.Dispose();
332+
333+
ItemsViewAdapter.Dispose();
325334
}
326335

327336
if (_snapManager != null)
@@ -349,7 +358,7 @@ protected virtual void LayoutOnPropertyChanged(object sender, PropertyChangedEve
349358
{
350359
UpdateSnapBehavior();
351360
}
352-
else if (propertyChanged.IsOneOf(ListItemsLayout.ItemSpacingProperty,
361+
else if (propertyChanged.IsOneOf(ListItemsLayout.ItemSpacingProperty,
353362
GridItemsLayout.HorizontalItemSpacingProperty, GridItemsLayout.VerticalItemSpacingProperty))
354363
{
355364
UpdateItemSpacing();
@@ -408,6 +417,7 @@ protected virtual void UpdateEmptyView()
408417

409418
_emptyViewAdapter.EmptyView = emptyView;
410419
_emptyViewAdapter.EmptyViewTemplate = emptyViewTemplate;
420+
411421
Watch(ItemsViewAdapter);
412422
}
413423
else
@@ -479,7 +489,7 @@ void ScrollToRequested(object sender, ScrollToRequestEventArgs args)
479489
protected virtual void ScrollTo(ScrollToRequestEventArgs args)
480490
{
481491
var position = DeterminePosition(args);
482-
492+
483493
if (args.IsAnimated)
484494
{
485495
ScrollHelper.AnimateScrollToPosition(position, args.ScrollToPosition);

0 commit comments

Comments
 (0)