Skip to content

Instantly share code, notes, and snippets.

@jedusei
Created September 30, 2022 12:54
Show Gist options
  • Save jedusei/e15f45e1ae385d8b57413c168d3ef730 to your computer and use it in GitHub Desktop.
Save jedusei/e15f45e1ae385d8b57413c168d3ef730 to your computer and use it in GitHub Desktop.
MAUI CollectionView Android Scroll Lag Workaround
// Platforms/Android/CollectionViewAdapter.cs
using Android.Content;
using AndroidX.RecyclerView.Widget;
using Microsoft.Maui.Controls.Handlers.Items;
public class CollectionViewAdapter : ReorderableItemsViewAdapter<ReorderableItemsView, IGroupableItemsViewSource>
{
private readonly List<DataTemplate> _dataTemplates = new();
private const int _textItemViewType = 41; // Microsoft.Maui.Controls.Handlers.Items.ItemViewType.TextItem
private const int _templatedItemViewType = 42; // Microsoft.Maui.Controls.Handlers.Items.ItemViewType.TemplatedItem
public CollectionViewAdapter(ReorderableItemsView reorderableItemsView, Func<View, Context, ItemContentView> createView = null) : base(reorderableItemsView, createView)
{
}
public override int GetItemViewType(int position)
{
int type = base.GetItemViewType(position);
if (type == _templatedItemViewType && ItemsView.ItemTemplate is DataTemplateSelector dataTemplateSelector)
{
DataTemplate dataTemplate = dataTemplateSelector.SelectTemplate(ItemsSource.GetItem(position), ItemsView);
int index = _dataTemplates.IndexOf(dataTemplate);
if (index == -1)
{
index = _dataTemplates.Count;
_dataTemplates.Add(dataTemplate);
}
return index;
}
return type;
}
public override RecyclerView.ViewHolder OnCreateViewHolder(Android.Views.ViewGroup parent, int viewType)
{
if (viewType >= _textItemViewType)
return base.OnCreateViewHolder(parent, viewType);
return new TemplatedItemViewHolder(
new ItemContentView(parent.Context),
_dataTemplates[viewType],
ItemsView.SelectionMode is not SelectionMode.None
);
}
public override void OnDetachedFromRecyclerView(RecyclerView recyclerView)
{
base.OnDetachedFromRecyclerView(recyclerView);
_dataTemplates.Clear();
}
}
// Platforms/Android/CollectionViewHandlerEx.cs
using Microsoft.Maui.Controls.Handlers.Items;
public class CollectionViewHandlerEx : CollectionViewHandler
{
protected override ReorderableItemsViewAdapter<ReorderableItemsView, IGroupableItemsViewSource> CreateAdapter()
{
return new CollectionViewAdapter(VirtualView);
}
}
// Register Custom Android CollectionView Handler
// Add this to the MauiApp.CreateBuilder() call chain
#if ANDROID
.ConfigureMauiHandlers(h => {
h.AddHandler(typeof(CollectionView), typeof(CollectionViewHandlerEx));
})
#endif
@Kanat9494
Copy link

how to register the handler?

@Kanat9494
Copy link

Thank you, but it didn't solve my problem

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment